<和>防止文本保存在数组中

时间:2016-12-28 12:29:01

标签: php arrays regex xml

我正在做的是获取XML文件的<To>标签内的文本(如下所示)并将其保存在另一个php文件的数组中。我正在使用此代码:

  <?php
    $email = simplexml_load_file($path);
    foreach($email->thread as $thread){
            foreach($thread->email as $text){
                 $recipients[] = $text->To;
            }
    }
    print_r($recipients);
 ?>

浏览器上显示的是填充了地址的数组,但对于以下XML的数组元素,只有a,(逗号)可见,因为&lt;&gt;代码中的地址不是被保存到数组。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <thread>
      <name></name>
      <email>
         <EmailID></EmailID>
         <From></From>
         <To>&lt;agenda@ietf.org&gt; , &lt;discuss@apps.ietf.org&gt;</To>
         <Subject></Subject>
         <Text>
           <content> </content>           
         </Text>
      </email>
   </thread>
</root>

我在浏览器中的当前输出:

array([0] =&gt; simplexmlelement object([0] =&gt; discuss@apps.ietf.org)[1] =&gt; simplexmlelement object([0] =&gt; discuss@apps.ietf.org ,jpalme @dsv.su.se)[2] =&gt; simplexmlelement对象([0] =&gt;特里艾伦)[3] =&gt; simplexmlelement对象([0] =&gt;,)...等

3 个答案:

答案 0 :(得分:1)

PHP将<hello@whatever.com>视为<To>的子节点 - 因此实际保存没有任何价值。

您有几个选项,理想的方法是编辑XML,以便将节点值包装在<![CDATA[ ... ]]>标记中。这将确保节点中的值被视为值而不是子节点。

或者,一个更丑陋的解决方案是find the children of the <To> node using children(),然后使用getName()方法。这将返回节点名称。它会起作用,但它很难看。

修改:或者,您可以参考this answer - 它解释了如何使用DOM,然后强制阅读<To>的内容作为文字。

答案 1 :(得分:1)

我发现了两个问题:

  1. SimpleXML扩展不会创建常规对象。它创建动态生成的对象,在您阅读它们时进行扩展。因此,您无法正常使用print_r()来可靠地检查XML内容。

  2. 同样,表示XML内容的类属性是动态生成的对象,而不是字符串。它们只查看字符串,因为它们有一个内部__toString()方法,当您将它们转换为字符串时,它会提取文本数据。这可以在你echo时使用,但不会在例如将它们附加到数组时(因为它不会触发转换操作)。

  3. (毋庸置疑,如果您将XML打印到浏览器,您需要确保它不会通过发送适当的Content-Type标头或通过检查浏览器中的原始源来呈现为HTML,通常按 Ctrl + U 。)

    我建议你自己强制进行字符串转换:

    foreach($email->thread as $thread){
        foreach($thread->email as $text){
            $recipients[] = (string)$text->To;
        }
    }
    print_r($recipients);
    

答案 2 :(得分:-1)

您可以使用SimpleXML_load_string()函数将XML转换为对象。然后使用json_encode($ obj)将对象转换为JSON并解码它以获取数组(json_decode())。