去除某些<;tr>;基于关键字的损坏或无效HTML


removing certain <tr> from broken or Invalid HTML based on keyword

我在从远程页面(主(检索的html中删除某些<tr>时遇到问题

问题是html无效或损坏了,我的代码在测试有效井时运行良好

格式化的html,但当涉及到远程页面的代码时,它在一些之后不起作用

如果实验发现我是因为远程页面的html代码是无效的

这是我的代码:

<?php
    //Get the url
    $url = "http://lsh.streamhunter.eu/static/section0.html";
    $html = file_get_contents($url);
    $doc = new DOMDocument(); // create DOMDocument
    @$doc->loadHTML($html); // load HTML you can add $html
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query("//td[contains(., 'desktop')]"); // search td's that contain 'desktop'
    foreach($elements as $el){
        $parent = $el->parentNode;
        $parent->parentNode->removeChild($parent); // remove TR
        //$parent->removeChild($el); // remove TD
    }
    echo $doc->saveHTML(); // save new HTML
?>

它总是给我500内部服务器错误,尽管当我在格式良好的html上测试它时,它工作得很好?

上面的代码中有我遗漏的东西吗?有什么解决这个问题的建议吗?

问题是,当您删除一个TR时,下一个TD将是孤立的,您可能会收到该错误,因为parentNode属性引用了一个不再存在的节点。

改为:

$toRemove = array();
// gather a list of TRs to remove
foreach($elements as $el)
  if(!in_array($el->parentNode, $toRemove, true))
    $toRemove[] = $el->parentNode;
// remove them
foreach($toRemove as $tr)
  $tr->parentNode->removeChild($tr);

此外,要抑制验证警告,请添加:

libxml_use_internal_errors(true);

在加载HTML之前(并删除@运算符(。