PHP substr不';我什么也不回应
我对这段代码有问题,PHP方法“substr”正在播放。我就是不明白。这里有一个简短的介绍,我正在努力实现的目标。我有一个巨大的XML文档,其中有来自Joomla的电子邮件订户。我试图将其导入Mailchimp,但是Mailchimp对将电子邮件导入列表的方法的语法有一些规则。所以现在的语法是这样的:PHP substr不';我什么也不回应,php,substring,substr,Php,Substring,Substr,我对这段代码有问题,PHP方法“substr”正在播放。我就是不明白。这里有一个简短的介绍,我正在努力实现的目标。我有一个巨大的XML文档,其中有来自Joomla的电子邮件订户。我试图将其导入Mailchimp,但是Mailchimp对将电子邮件导入列表的方法的语法有一些规则。所以现在的语法是这样的: <subscriber> <subscriber_id>615</subscriber_id> <name><![CDATA[
<subscriber>
<subscriber_id>615</subscriber_id>
<name><![CDATA[NAME OF SUBSCRIBER]]></name>
<email>THE_EMAIL@SOMETHING.COM</email>
<confirmed>1</confirmed>
<subscribe_date>THE DATE</subscribe_date>
</subscriber>
如果我能做到这一点,我就可以把它复制粘贴到Mailchimp中
现在是我的PHP脚本,到目前为止:
$fileName = file_get_contents('emails.txt');
foreach(preg_split("/((\r?\n)|(\r\n?))/", $fileName) as $line){
if(strpos($line, '<name><![CDATA[')){
$name = strpos($line, '<name><![CDATA[');
$nameEnd = strpos($line, ']]></name>', $name);
$nameLength = $nameEnd-$name;
echo "<br />";
echo " " . strlen(substr($line, $name, $nameLength));
echo " " . gettype(substr($line, $name, $nameLength));
echo " " . substr($line, $name, $nameLength);
}
if(strpos($line, '<email>')){
$var1 = strpos($line, '<email>');
$var2 = strpos($line, '</email>', $var1);
$length = $var2-$var1;
echo substr($line, $var1, $length);
}
}
$fileName=文件获取内容('emails.txt');
foreach(preg_split(“/(\r?\n)|(\r\n?)/”,$fileName)作为$line){
if(strpos($line,,$name);
$nameLength=$nameEnd-$name;
回声“
”;
echo“.strlen(substr($line,$name,$nameLength));
echo“.gettype(substr($line,$name,$nameLength));
echo“.substr($line,$name,$nameLength);
}
如果(STRPO($line,“)){
$var1=strpos($line,”);
$var2=strpos($line,,$var1);
$length=$var2-$var1;
echo substr($line,$var1,$length);
}
}
第一个if语句按其应该的方式工作。它标识行上是否有“”-标记,如果有,则查找结束标记并使用substr方法输出电子邮件
第二个if语句让我很恼火。if应该做与第一个if语句相同的事情,但它没有做。长度是正确的长度(我已检查)。类型是正确的类型(我已检查)。但是当我尝试回显它时,什么也没有发生。脚本仍在运行,但它没有写入任何内容
我已经试过很多次了,似乎什么都试过了——但我想不出来
警告此函数可能返回布尔值FALSE,但也可能返回计算结果为FALSE的非布尔值。有关详细信息,请阅读布尔值部分。使用===运算符测试此函数的返回值 您应该使用
if(strpos($line,…')!==false){
除此之外,您的文件似乎是XML,所以您应该使用XML解析器,以免陷入错误
DOMDocument
是一个很好的文档。您可以这样做:
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
$dom = new DOMDocument();
$dom->load("emails.txt");
$subs = $dom->getElementsByTagName('subscriber');
$count = $subs->length;
for( $i=0; $i<$l; $i++) {
$sub = $subs->item($i);
echo $sub->getElementsByTagName('email')->item(0)->nodeValue;
echo " ";
echo $sub->getElementsByTagName('name')->item(0)->nodeValue;
echo "\n";
}
$dom=newdomdocument();
$dom->load(“emails.txt”);
$subs=$dom->getElementsByTagName('subscriber');
$count=$subs->length;
对于($i=0;$i项目($i);
echo$sub->getElementsByTagName('email')->item(0)->nodeValue;
回声“;
echo$sub->getElementsByTagName('name')->item(0)->nodeValue;
回音“\n”;
}
这将以您描述的格式输出姓名和电子邮件
警告此函数可能返回布尔值FALSE,但也可能返回计算结果为FALSE的非布尔值。有关详细信息,请阅读布尔值部分。使用===运算符测试此函数的返回值 您应该使用
if(strpos($line,…')!==false){
除此之外,您的文件似乎是XML,所以您应该使用XML解析器,以免陷入错误
DOMDocument
是一个很好的文档。您可以这样做:
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
[THE_EMAIL@SOMETHING.COM] [NAME OF SUBSCRIBER]
$dom = new DOMDocument();
$dom->load("emails.txt");
$subs = $dom->getElementsByTagName('subscriber');
$count = $subs->length;
for( $i=0; $i<$l; $i++) {
$sub = $subs->item($i);
echo $sub->getElementsByTagName('email')->item(0)->nodeValue;
echo " ";
echo $sub->getElementsByTagName('name')->item(0)->nodeValue;
echo "\n";
}
$dom=newdomdocument();
$dom->load(“emails.txt”);
$subs=$dom->getElementsByTagName('subscriber');
$count=$subs->length;
对于($i=0;$i项目($i);
echo$sub->getElementsByTagName('email')->item(0)->nodeValue;
回声“;
echo$sub->getElementsByTagName('name')->item(0)->nodeValue;
回音“\n”;
}
这将以您描述的格式输出姓名和电子邮件。因此这有一些问题,包括
strpos
命令,如果它在行首找到标记,它将实际返回0
,这似乎不是您想要的
此外,如果XML的格式与您的格式不完全一样,每个开始和结束标记都在一行上,那么您的逻辑也将失败
因此,重新发明XML处理不是一个好主意
正如其他人所建议的那样,这是解决问题的更好办法*
$xml = simplexml_load_file('emails.txt');
foreach( $xml->subscriber as $sub )
{
// Note that SimpleXML is aware of CDATA, and only outputs the text
$output = '[' . $sub->name . ']' . ' ' . '[' . $sub->email . ']';
}
*这假设您的XML是有效的,即“订户”块包含在顶层的单个父级中。当然,您可以使用来根据您的用例进行调整。因此,这有一些问题,包括
strpos
命令,如果它在行的开头找到标记,它将实际返回0
,这似乎不是您想要的
此外,如果XML的格式与您的格式不完全一样,每个开始和结束标记都在一行上,那么您的逻辑也将失败
因此,重新发明XML处理不是一个好主意
正如其他人所建议的那样,这是解决问题的更好办法*
$xml = simplexml_load_file('emails.txt');
foreach( $xml->subscriber as $sub )
{
// Note that SimpleXML is aware of CDATA, and only outputs the text
$output = '[' . $sub->name . ']' . ' ' . '[' . $sub->email . ']';
}
*这假设您的XML是有效的,即“订户”块包含在顶层的单个父级中。当然,您可以使用来根据您的用例进行调整。是否有特定的原因使用这种繁琐的字符串处理方法而不是?欢迎使用堆栈溢出!请避免使用正则表达式解析HTML。请改为使用正则表达式。使用正则表达式有特定的原因吗这种笨重的字符串篡改方法代替了?欢迎使用堆栈溢出!请避免使用正则表达式解析HTML。请改用正则表达式。我认为simplexml可能是更好的选择,DOMDocument适合使用HTML和DOM,但simplexml中的基本XML解析可能更好。至少根据我的示例,它的代码更少低。我认为simplexml可能是一个更好的选择,DOMDocument适合于处理HTML和DOM,但simplexml中的基本XML解析可能更好。至少根据我下面的示例,它的代码更少。