尝试使用 DOMDocument 清理 HTML 时出错


Errors while trying to cleanup HTML with DOMDocument

我正在尝试获取网页的HTML并去除<script>标签。我可以获取 HTML(通过使用 cURL (,但我无法使用 PHP 的 DOMDocument 剥离<script>标签。剥离标签只是我想用 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: 在 Entity 中没有名称,第 24 行在 C:...''code''views''index.phtml 在第 22 行

我从 cURL 调用中得到的 HTML:

http://pastebin.com/TrV99wAr

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

安全第一

对于HTML输入的清理,只有一种工具可以保护您。如果不是您自己管理的数据,则始终必须使用此工具。(甚至比,如果有人获得您的登录数据,使用它可能会更好(。

始终使用 HTMLPurifier:

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

我无法重现您的错误。

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

该错误意味着您的 HTML 中有一个不是 HTML 实体的&。这些应始终编码为 &amp;