Analizador DOM que permite la etiqueta </ in <script> de estilo HTML5

Actualizar: html5lib (parte inferior de la pregunta) parece acercarse, solo necesito mejorar mi comprensión de cómo se usa.

Estoy intentando encontrar un analizador DOM compatible con HTML5 para PHP 5.3. En particular, necesito acceder al siguiente CDATA tipo HTML dentro de una etiqueta de script:

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

La mayoría de los analizadores finalizarán el análisis prematuramente porque HTML 4.01finaliza el análisis de etiquetas de script cuando encuentra ETAGO (</) dentro de una<script> etiqueta. Sin embargo, HTML5permite para</ antes de</script>. Todos los analizadores que he probado hasta ahora han fallado o están tan mal documentados que no he descubierto si funcionan o no.

Mis requisitos:

Analizador real, no hacks regex.Capacidad para cargar páginas completas o fragmentos HTML.Capacidad para extraer guionescontenido retroceder, seleccionando por el atributo id de la etiqueta.

Entrada:

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

Ejemplo de salida fallida (sin cierre</td>):

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

Algunos analizadores y sus resultados:


DOMDocument (falla)

Fuente:

<?php

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

Salida:

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>


DOM fluido (falla)

Fuente:

<?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');

Salida:

<!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 (falla)

Fuente:

<?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 (cadena) pq ('# foo');

Salida:

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


html5lib (pasa)

Posiblemente prometedor. ¿Puedo acceder al contenido de lascript#foo ¿etiqueta?

Fuente:

<?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();

Salida:

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

Respuestas a la pregunta(5)

Su respuesta a la pregunta