从 SimpleXML 节点提取 HTML


HTML Extraction from SimpleXML node

场景

我正在使用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的样式语法或带有"blogger-post-footer"类的元素。是否有一个类或函数可以识别这些特定的 HTML 元素并允许我去除不相关的元素?

更新

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

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

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

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

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);
}

获取字符串,对字符串使用html_entity_decode()来获取原始HTML。 使用strip_tags()删除所有html或使用内容HTML创建另一个简单的XML对象,然后遍历并删除样式/其他属性和标记。

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

您还可以使用以下正则表达式方法来清理字符串,同时保留 img 和标签

$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);

尽管您必须解码 HTML 实体才能使此方法正常工作。