场景
我正在使用PHP的SimpleXML来解析博客提要。树中最重要的节点是内容。我想从节点上修剪脂肪,即博客网站添加的样式功能。它都包含在同一个节点中,并且 html 实体被编码。FirePHP 日志记录显示字符串是 HTML。
例如,内容节点如下所示:
<content type='html'>
BLAH BLAH BLAH.<div class="blogger-post-footer"><img width='1'
height='1' src='https://blogger.googleusercontent.com/tracker
6552111825067891333-7815715921198109330?l=cobracabanarecords.blogspot.com'
alt='' /></div>
<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;
"><img border="0" height="92" src="http://4.bp.blogspot.com/
-RQPMMDLPMqg/T9ePf9jbXFI/AAAAAAAAAGs/6egu-05Zim4/s320/blogHeader.jpg"
width="320" /></a>
<a href="http://website.com">Homepage!</a>
</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);
}
从
您还可以使用 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 实体才能使此方法正常工作。