Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP substr不';我什么也不回应_Php_Substring_Substr - Fatal编程技术网

PHP substr不';我什么也不回应

PHP substr不';我什么也不回应,php,substring,substr,Php,Substring,Substr,我对这段代码有问题,PHP方法“substr”正在播放。我就是不明白。这里有一个简短的介绍,我正在努力实现的目标。我有一个巨大的XML文档,其中有来自Joomla的电子邮件订户。我试图将其导入Mailchimp,但是Mailchimp对将电子邮件导入列表的方法的语法有一些规则。所以现在的语法是这样的: <subscriber> <subscriber_id>615</subscriber_id> <name><![CDATA[

我对这段代码有问题,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>
如果我能做到这一点,我就可以把它复制粘贴到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解析可能更好。至少根据我下面的示例,它的代码更少。