0

我遇到了这段代码的问题,并且 PHP 方法“substr”正在播放。我只是不明白。这是我想要实现的快速介绍。我有来自 Joomla 的电子邮件订阅者的大量 XML 文档。我正在尝试将其导入 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 语句正常工作。它识别,如果行上有一个''-标签,如果有,那么它会找到结束标签并使用 substr 方法输出电子邮件。

第二个 if 语句让我很烦。If 应该和第一个 if 语句做同样的事情,但事实并非如此。长度是正确的长度(我已经检查过)。类型是正确的类型(我已经检查过)。但是当我尝试回应它时,什么也没有发生。该脚本仍然运行,但它不写任何东西。

我已经玩了很多次并且似乎已经尝试了所有方法 - 但我无法弄清楚。

4

2 回答 2

3

警告
此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。

你应该使用if(strpos($line,'...') !== false) {

除此之外,您的文件似乎是 XML,因此您应该使用 XML 解析器,以免您落入他来的小马

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";
}

这将以您描述的格式输出姓名和电子邮件。

于 2012-10-22T19:54:49.620 回答
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 文档来调整您的用例。

于 2012-10-22T20:18:47.497 回答