SimpleXMLElement Cast as String不作为字符串

时间:2013-08-19 18:03:52

标签: php casting simplexml explode strpos

好的,我正在使用SimpleXML来解析RSS提要,并且由于许多提要包含嵌入的html,我希望能够隔离嵌入式html中包含的任何图像地址。听起来很简单,但是我遇到了解析SimpleXMLElement对象数据的问题。这是相关的代码。

for($i = 0; $i < count($articles); $i++) {
    foreach($articles[$i] as $feedDeet) {
        $str = (string)$feedDeet;
        $result = strpos($str, '"');
        if($result === false) {
            echo 'There are apparently no quotes in this string: '.$str;
        }
        $explodedString = explode('"', $str);
        echo "<br>";
        if($explodedString[0] == $str) {
            echo 'ExplodedString is equal to str. Apparently, once again, the string contains no quotes.';
        }
        echo "<hr>";
    }
}

在这种情况下,$ articles是一个SimpleXMLElement对象数组,每个对象代表一篇RSS文章,并包含许多表示该文章属性和细节的子SimpleXMLElement对象。基本上,我想逐个遍历这些属性,将它们转换为字符串,然后使用任何引号作为分隔符来爆炸字符串(因为任何图像地址都将包含在引号内)。然后,我将解析爆炸数组并搜索任何看似图像地址的字符串。但是,explode()和strpos()的行为都不像我期望的那样。举一个我的意思的例子,上面代码的一个输出如下:

There are apparently no quotes in this string: <p style="text-align: center;"><img class="alignnone size-full wp-image-243922" alt="gold iPhone Shop Le Monde" src="http://media.idownloadblog.com/wp-content/uploads/2013/08/gold-iPhone-Shop-Le-Monde.jpg" width="593" height="515" /></p> <p>Folks still holding out hope that the gold iPhone rumors aren’t true may want to brace themselves, the speculation has just been confirmed by the Wall Street Journal-owned blog AllThingsD. And given the site’s near perfect (perfect?) track record with predicting future Apple plans, and <a href="http://www.idownloadblog.com/2013/08/16/is-this-apples-gold-colored-iphone-5s/">corroborating evidence</a>, we’d say Apple is indeed going for the gold…(...)<br/>Read the rest of <a href="http://www.idownloadblog.com/2013/08/19/allthingsd-gold-iphone-yes/">AllThingsD confirms gold iPhone coming</a></p> <hr /> <p><small> "<a href="http://www.idownloadblog.com/2013/08/19/allthingsd-gold-iphone-yes/">AllThingsD confirms gold iPhone coming</a>" is an article by <a href="http://www.idownloadblog.com">iDownloadBlog.com</a>. <br/>Make sure to <a href="http://twitter.com/iDownloadBlog">follow us on Twitter</a>, <a href="http://www.facebook.com/iPhoneDownloadBlog">Facebook</a>, and <a href="https://plus.google.com/u/0/b/111910843959038324995/">Google+</a>. </small></p>
ExplodedString is equal to str. Apparently, once again, the string contains no quotes.

很抱歉,如果这有点难以阅读,则会从输出中逐字复制。

正如你所看到的,有问题的字符串中有明显的引号,但strpos返回false,这意味着无法找到指定的字符串,并且explode返回一个内部包含原始字符串的数组,表示找不到指定的分隔符。这里发生了什么?我被这几个小时困扰了,我觉得我正在失去理智。

谢谢!

1 个答案:

答案 0 :(得分:1)

您在此处犯的错误是您的调试输出是一个HTML页面,因此您打印的消息将被浏览器解释为HTML。要查看其实际内容,您需要查看页面来源,或使用<pre>标记来保留空格,并htmlspecialchars()添加一层HTML转义:echo '<pre>' . htmlspecialchars($str) . '</pre>';

如果浏览器中的输出看起来像<p style="text-align: center;">,那么显然输入已经使用HTML实体进行了转义,实际上可能看起来像&lt;p style=&quot;text-align: center;&quot;&gt;。虽然&quot; 看起来像" ,但它不是相同的字符串,因此strpos()找不到它。

为了撤消这个额外的转义层,你可以在处理它之前在字符串上运行html_entity_decode()