Ошибки при попытке очистки HTML с помощью DOMDocument

Я пытаюсь получить HTML-код веб-страницы и удалить из него теги <script>. Я могу получить HTML (используя cURL), но я не могу удалить теги <script>, используя PHP 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: нет имени в Entity, строка: 24 в C:...\code\views\index.phtml в строке 22

HTML, который я получил от вызова cURL:

http://pastebin.com/TrV99wAr

Есть ли способ позволить DOMDocument исправить ошибки или, по крайней мере, позволить ему проанализировать остальную часть html?


person PeeHaa    schedule 05.01.2012    source источник


Ответы (2)


Безопасность прежде всего

Для очистки HTML-ввода есть только один инструмент, который может вас защитить. Вы всегда должны использовать этот инструмент, если вы сами не управляете данными. (и даже чем, в случае, если кто-то получит ваши логин-данные, может быть лучше использовать их).

Всегда используйте HTMLPurifier:

Это может быть ресурсоемким, но все остальное похоже на наведение пистолета на вашу инфраструктуру. http://htmlpurifier.org/

Я не смог воспроизвести вашу ошибку.

Поэтому я предполагаю, что это может быть ошибка, зависящая от версии/платформы. я тестировал на WinXP,Pro,x86,SP3/PHP5.3.3

person Samuel Herzog    schedule 05.01.2012
comment
as pastebin usually is. Я не получаю свой HTML из pastebin. Есть только образец HTML, который я получаю, чтобы показать ошибку :) - person PeeHaa; 05.01.2012
comment
да, моя ошибка, я уже исправил ее ^^ просто слишком быстро просмотрел код/ссылки g - person Samuel Herzog; 05.01.2012
comment
также добавить: 1) я не знаю, что htmlpurifier использует внутри, и я углубляюсь в вашу проблему, чтобы увидеть, где была ошибка. может это поможет вам учиться и кому-то еще, кто не хочет дезинфицировать html;) - person Samuel Herzog; 05.01.2012
comment
хорошо, извините, но если я вставлю ваш код pastebin в .txt, скопируйте и вставьте ваш код и замените $html = get_html('http://www.google.nl'); на $html = file_get_contents('google.nl.txt');, я не получу ни одной ошибки. и я чувствую себя ребёнком из-за такого количества копий и вставок ^^ - person Samuel Herzog; 05.01.2012
comment
Это не та часть получения HTML, которая вызывает ошибку. Но часть, где DOMDocument пытается его разобрать :P И я использую cURL :) - person PeeHaa; 05.01.2012
comment
есть ли у вас дополнительная информация, которая могла бы помочь нам сузить круг этой ошибки? это повторяется, если вы не скручиваете, а загружаете из файла? - person Samuel Herzog; 05.01.2012
comment
@PeeHaa Я знаю, и в этом проблема, я использовал весь ваш скрипт, кроме одной строки, которая, как вы сказали, не создает проблемы. Я сделал суть, чтобы помочь вам увидеть. gist.github.com/1563560 - person Samuel Herzog; 05.01.2012

Эта ошибка означает, что у вас есть & в вашем HTML, который не является сущностью HTML. Они всегда должны быть закодированы как &amp;.

person Niet the Dark Absol    schedule 05.01.2012
comment
Ну, очевидно, это не мой код (я не владею google.nl): P Как мне предотвратить получение этих ошибок и позволить ему анализировать html? - person PeeHaa; 05.01.2012
comment
Включить внутренние ошибки для libxml: libxml_use_internal_errors(true); - person Niet the Dark Absol; 05.01.2012