尝试使用DOMDocument清理HTML时出错

时间:2012-01-05 02:46:35

标签: php domdocument

我正在尝试获取网页的HTML并删除<script>标记。我可以获取HTML(使用cURL),但我无法使用PHP的<script>删除DOMDocument标记。剥离标签只是我想用DOMDocument做的一件事,所以我不能使用其他解决方案(我可以使用其他一些DOM解析器,但我只是想知道如何解决它。)

我的代码:

function clean_html(&$html, $targets = array('script'))
{
    $doc = new DOMDocument();
    $doc->loadHTML($html); // here I get the error

    foreach($targets as $target) {
        $tags = $doc->getElementsByTagName($target);
        $length = $tags->length;

        for ($i = 0; $i < $length; $i++) {
          $tags->item(0)->parentNode->removeChild($tags->item(0));
        }
    }

    return $doc->saveHTML();
}

$html = get_html('http://www.google.nl'); // this gets the HTML using cURL.
clean_html($html);

错误(很多这些+/- 20):

  

警告:DOMDocument :: loadHTML()[domdocument.loadhtml]:htmlParseEntityRef:实体中没有名称,第24行:C:... \ code \ views \ index.phtml第22行

我从cURL电话中获得的HTML:

http://pastebin.com/TrV99wAr

有没有办法让DOMDocument修复错误或者至少让它解析其余的html?

2 个答案:

答案 0 :(得分:2)

安全第一

对于HTML-Input的清理,只有一个可以保护您的工具。 如果不是您自己管理的数据,则必须始终使用此工具。 (甚至,如果有人获得您的登录数据,最好使用它)。

始终使用HTMLPurifier:

可能需要资源,但其他一切就像用枪指着你的基础设施。 http://htmlpurifier.org/

我无法重现您的错误。

因此我猜测它可能是版本/平台特定的错误。我在WinXP,Pro,x86,SP3 / PHP5.3.3上进行了测试

答案 1 :(得分:0)

该错误表示HTML中的&不是HTML实体。这些应始终编码为&amp;