在条件上从解析的HTML文档中删除HTML元素

时间:2012-03-11 11:44:28

标签: php html string html-parsing substring

我使用Simple PHP HTML DOM Parser解析了一个HTML文档。在解析的文档中有一个ul-tag,里面有一些li-tags。其中一个li-tag包含我想删除的那些可怕的“Add This”按钮之一。

更糟糕的是,列表项没有类或id,并且它并不总是在列表中的相同位置。所以没有简单的方法(纠正我,如果我错了)用解析器删除它。

我想要做的是在所有li元素中搜索字符串'addthis.com'并删除包含该字符串的任何元素。

<ul>
    <li>Foobar</li>
    <li>addthis.com</li><!-- How do I remove this? -->
    <li>Foobar</li>
</ul>

仅供参考:在我学习PHP的过程中,这是一个业余爱好项目,而不是内容被盗以获取利润。

欢迎所有建议!

3 个答案:

答案 0 :(得分:3)

无法找到明确删除节点的方法,但可以通过将outertext设置为空来删除。

$html = new simple_html_dom();
$html->load(file_get_contents("test.html"), false, false); // preserve formatting

foreach($html->find('ul li') as $element) {
  if (count($element->find('a.addthis_button')) > 0) {
    $element->outertext="";
  }
}

echo $html;

答案 1 :(得分:1)

你能做的就是在解析后使用jQuery。像这样:

$('li').each(function(i) {
    if($(this).html() == "addthis.com"){
        $(this).remove();
    }
});

答案 2 :(得分:0)

此解决方案使用DOMDocument类和domnode.removechild方法:

$str="<ul><li>Foobar</li><li>addthis.com</li><li>Foobar</li></ul>";
$remove='addthis.com';
$doc = new DOMDocument();
$doc->loadHTML($str);
$elements = $doc->getElementsByTagName('li');
$domElemsToRemove = array();
foreach ($elements as $element) {
  $pos = strpos($element->textContent, $remove); // or similar $element->nodeValue
  if ($pos !== false) {
    $domElemsToRemove[] = $element;
  }
}
foreach( $domElemsToRemove as $domElement ){
  $domElement->parentNode->removeChild($domElement);
}
$str = $doc->saveHTML(); // <ul><li>Foobar</li><li>Foobar</li></ul>