根据关键字删除某些损坏或无效的HTML

时间:2013-05-12 20:44:17

标签: php html

我在从远程页面检索的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上测试它时效果很好吗?

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

1 个答案:

答案 0 :(得分:0)

问题在于当你删除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之前(并删除@运算符)。