【问题标题】:HTML Extraction from SimpleXML node从 SimpleXML 节点提取 HTML
【发布时间】:2012-06-27 05:19:11
【问题描述】:

情景

我正在使用 PHP 的 SimpleXML 来解析博客提要。树中最重要的节点是内容。我想修剪节点的脂肪,即博客站点添加的样式功能。它都包含在同一个节点中,并且对 html 实体进行了编码。 FirePHP 日志显示该字符串是 HTML。

例如,内容节点如下所示:

<content type='html'>
BLAH BLAH BLAH.&lt;div class="blogger-post-footer"&gt;&lt;img width='1'
height='1' src='https://blogger.googleusercontent.com/tracker
6552111825067891333-7815715921198109330?l=cobracabanarecords.blogspot.com'
alt='' /&gt;&lt;/div&gt;
&lt;a href="http://4.bp.blogspot.com/-RQPMMDLPMqg/T9ePf9jbXFI/
AAAAAAAAAGs/6egu-05Zim4/s1600/blogHeader.jpg" imageanchor="1"
style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;
"&gt;&lt;img border="0" height="92" src="http://4.bp.blogspot.com/
-RQPMMDLPMqg/T9ePf9jbXFI/AAAAAAAAAGs/6egu-05Zim4/s320/blogHeader.jpg" 
width="320" /&gt;&lt;/a&gt;
&lt;a href="http://website.com"&gt;Homepage!&lt;/a&gt;
</content>

我的问题

我怎样才能去掉我想要的部分,并留下臃肿?我想保留文本、图像和链接,但不需要博客的样式语法或类“blogger-post-footer”的元素。是否有一个类或函数可以识别那些特定的 HTML 元素并允许我去除不相关的元素?

更新

我尝试了推荐的 html_entity_decode 函数。现在我有一个字符串中的原始 html。我阅读了 DOMDocument 类并尝试了这个:

$doc = new DOMDocument();
$doc->loadHTML($htmlContent);

使用 firephp 记录显示 $doc 变量仅包含数字 1,我无法像处理 HTML 一样操作字符串。如果我能让它工作,我认为下一步将是尝试一个 getElementsByTagName 函数,然后遍历节点列表以 removeChild,或将其复制到数组中。我仍然可以在这方面使用一些指导。

【问题讨论】:

    标签: php html xml-parsing simplexml


    【解决方案1】:

    中获取字符串,在字符串上使用html_entity_decode() 以获取原始 html。使用 strip_tags() 删除所有 html 或使用内容 html 创建另一个简单的 xml 对象,然后通过并删除样式/其他属性和标签。

    您还可以使用 strip_tags() 删除所有 html,除了允许的标签白名单。

    【讨论】:

    • Jonahthan,请查看我的编辑。您最初的提示很有帮助,但如果您可以提供的话,我可以使用更多帮助。
    【解决方案2】:

    您还可以使用以下Regular Expression method 来清理字符串,同时保留 img 和 a 标签

    $string_of_content = html_entity_decode(""); // Read the string into this and don't forget to decode the entities
    
    preg_replace("/<(?!img)(?!a).*?>/","",$string_of_content);
    

    虽然您必须decode the HTML entities 才能使此方法正常工作。

    【讨论】:

    • 您是否忘记了正则表达式周围的分隔符?此外,您可能希望将 .* 变成非贪婪的 .*? 甚至更好,否定 > 像 [^&gt;]*
    【解决方案3】:

    一旦我走上正轨,我就能在这里找到正确的语法:

    https://stackoverflow.com/a/4177407/1193509

    结果

    $htmlContent = html_entity_decode($entry->content);
    $doc = new DOMDocument();
    $doc->loadHTML($htmlContent);
    foreach($doc->getElementsByTagName('div') as $divs){
        $divs->parentNode->removeChild($divs);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2015-10-23
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多