Парсер DOM, который допускает тег </ in <script> в стиле HTML5

Обновить: html5lib (нижняя часть вопроса), кажется, близко, мне просто нужно улучшить мое понимание того, как он используется.

Я пытаюсь найти HTML5-совместимый DOM-парсер для PHP 5.3. В частности, мне нужно получить доступ к следующим HTML-подобным CDATA внутри тега script:

<script type="text/x-jquery-tmpl" id="foo">
    <table><tr><td>${name}</td></tr></table>
</script>

Большинство синтаксических анализаторов прекращают анализ преждевременно, потому что HTML 4.01заканчивает разбор тега скрипта когда найдет ЭТАГО (</) внутри<script> тег. Тем не менее, HTML5позволяет</ до</script>, Все парсеры, которые я пробовал до сих пор, либо потерпели неудачу, либо они настолько плохо документированы, что я не понял, работают они или нет.

Мои требования:

Настоящий парсер, а не хак регулярных выражений.Возможность загрузки полных страниц или фрагментов HTML.Возможность вытащить скриптсодержание отступить, выбирая по атрибуту id тега.

Входные данные:

<script id="foo"><td>bar</td></script>

Пример сбоя вывода (без закрытия</td>):

<script id="foo"><td>bar</script>

Некоторые парсеры и их результаты:


DOMDocument (Сбой)

Источник:

<?php

header('Content-type: text/plain');
$d = new DOMDocument;
$d->loadHTML('<script id="foo"><td>bar</td></script>');
echo $d->saveHTML();

Выход:

Warning: DOMDocument::loadHTML(): Unexpected end tag : td in Entity, line: 1 in /home/adam/public_html/2010/10/26/dom.php on line 5
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><script id="foo"><td>bar</script></head></html>


FluentDOM (Сбой)

Источник:

<?php

header('Content-type: text/plain');
require_once 'FluentDOM/src/FluentDOM.php';
$html = "<html><head></head><body><script id='foo'><td></td></script></body></html>";
echo FluentDOM($html, 'text/html');

Выход:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head></head><body><script id="foo"><td></script></body></html>


phpQuery (Сбой)

Источник:

<?php

header('Content-type: text/plain');

require_once 'phpQuery.php';

phpQuery::newDocumentHTML(<<<EOF
<script type="text/x-jquery-tmpl" id="foo">
<td>test</td>
</script>
EOF
);

echo (строка) pq ('# foo');

Выход:

<script type="text/x-jquery-tmpl" id="foo">
<td>test
</script>


html5lib (Проходит)

Возможно, перспективно. Могу ли я получить на содержаниеscript#foo тег?

Источник:

<?php

header('Content-type: text/plain');

include 'HTML5/Parser.php';

$html = "<!DOCTYPE html><html><head></head><body><script id='foo'><td></td></script></body></html>";
$d = HTML5_Parser::parse($html);

echo $d->saveHTML();

Выход:

<html><head></head><body><script id="foo"><td></td></script></body></html>

Ответы на вопрос(5)

Ваш ответ на вопрос