我遇到了这段代码的问题,PHP方法'substr'正在播放。我只是不明白。这是我正在努力实现的快速介绍。我有这个庞大的XML文档,其中包含来自Joomla的电子邮件订阅者。我正在尝试将其导入Mailchimp,但Mailchimp对于将电子邮件导入列表的方法的语法有一些规则。所以目前语法是这样的:
<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>
我想创建一个简单的PHP脚本,它接收所有这些电子邮件并输出如下:
[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]
如果我能做到这一点,那么我可以将其复制粘贴到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);
}
}
第一个if语句可以正常工作。它标识,如果行上有''-tag,如果有,则找到结束标记并使用substr-method输出电子邮件。
第二个if语句令我讨厌。如果应该与第一个if语句做同样的事情,但事实并非如此。长度是正确的长度(我已经检查过)。类型是正确的类型(我已经检查过)。但是当我试图回应它时,没有任何反应。该脚本仍然运行,但它不会写任何内容。
我玩了很多,似乎已经尝试了一切 - 但我无法理解。
答案 0 :(得分:3)
警告强>
此函数可能返回布尔值FALSE,但也可能返回非布尔值,其值为FALSE。有关更多信息,请阅读有关布尔值的部分。使用===运算符测试此函数的返回值。
您应该使用if(strpos($line,'...') !== false) {
除此之外,您的文件似乎是XML,因此您应该使用XML解析器,以免属于the pony he comes。
DOMDocument
是个好人。你可以这样做:
$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";
}
这将以您描述的格式输出姓名和电子邮件。
答案 1 :(得分:1)
所以这有一些问题,包括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有效,即“订阅者”块包含在顶级的单个父级中。您当然可以使用simplexml documentation来调整用例。