PHP substr不回显任何东西

时间:2012-10-22 19:48:15

标签: php substring substr

我遇到了这段代码的问题,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语句做同样的事情,但事实并非如此。长度是正确的长度(我已经检查过)。类型是正确的类型(我已经检查过)。但是当我试图回应它时,没有任何反应。该脚本仍然运行,但它不会写任何内容。

我玩了很多,似乎已经尝试了一切 - 但我无法理解。

2 个答案:

答案 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来调整用例。