php - todas - Analizador DOM que permite la etiqueta</ in<script> de estilo HTML5
script dentro de un html (5)
Agregué etiquetas de comentarios ( <!-- ... -->
) en mis bloques de plantilla jQuery (los bloques CDATA también fallaron) y DOMDocument no tocó el HTML interno.
Luego, antes de usar las plantillas jQuery, escribí un script para eliminar los comentarios.
$(function() {
$(''script[type="text/x-jquery-tmpl"]'').text(function() {
// The comment node in this context is actually a text node.
return $.trim($(this).text()).replace(/^<!--([/s/S]*)-->$/, ''$1'');
});
});
No es ideal, pero no estaba seguro de una mejor solución.
Actualización : html5lib
(al final 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 código HTML similar a CDATA 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.01 finaliza el análisis de la etiqueta de script cuando encuentra ETAGO ( </
) dentro de una etiqueta <script>
. Sin embargo, HTML5 permite </
before </script>
. Todos los analizadores que he probado hasta ahora han fallado, o están tan mal documentados que no he averiguado si funcionan o no.
Mis requisitos:
- Analizador real, no hacks de expresiones regulares.
- Posibilidad de cargar páginas completas o fragmentos de HTML.
- Posibilidad de sacar los contenidos del script de nuevo, seleccionando por el atributo de identificación del tag.
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>
FluentDOM (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 (pases)
Posiblemente prometedor. ¿Puedo obtener el contenido de la script#foo
de script#foo
tag?
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>
FluentDOM usa DOMDocument pero bloquea los avisos de carga y advertencias. No tiene un analizador propio. Puede agregar sus propios cargadores (por ejemplo, uno que use el html5lib).
Me encontré con este problema exacto.
PHP Dom Document analiza el html dentro de una etiqueta de script y eso puede conducir a una dom completamente diferente.
Como no quería usar otra biblioteca que DomDocument. Escribí algunas líneas que eliminan cualquier contenido de script, luego haces lo que necesites hacer con el documento dom y luego vuelves a poner el contenido de ese script.
Obviamente, el contenido del script no está disponible para su objeto dom porque está vacío.
Con las siguientes líneas de código php puede ''arreglar'' este problema. Tenga en cuenta que las etiquetas de script en las etiquetas de los scripts causarán errores.
$scripts = array();
// this will select all script tags non-greedy. If you have a script tag in your script tag, it will cause problems.
preg_match_all("/((<script.*>)(.*))//script>/sU", $html, $scripts);
// Make content of scripts empty
$html = str_replace($scripts[3], '''', $html);
// Do DOM Document stuff here
// Put script contents back
$html = str_replace($scripts[2], $scripts[1], $html);
Espero que esto ayude a algunas personas :-).
Re: html5lib
Haga clic en la pestaña de descarga y descargue la versión de PHP del analizador .
Destraba el archivo en una carpeta local
tar -zxvf html5lib-php-0.1.tar.gz
x html5lib-php-0.1/
x html5lib-php-0.1/VERSION
x html5lib-php-0.1/docs/
... etc
Cambia directorios y crea un archivo llamado hello.php
cd html5lib-php-0.1
touch hello.php
hello.php
el siguiente código PHP en hello.php
$html = ''<html><head></head><body>
<script type="text/x-jquery-tmpl" id="foo">
<table><tr><td>${name}</td></tr></table>
</script>
</body></html>'';
$dom = HTML5_Parser::parse($html);
var_dump($dom->saveXml());
echo "/nDone/n";
hello.php
desde la línea de comando
php hello.php
El analizador analizará el árbol de documentos y devolverá un objeto DOMDocument, que se puede manipular como cualquier otro objeto DOMDocument.
Tuve el mismo problema y, al parecer, puedes hackear tu camino a través de esto cargando el documento como XML y guardándolo como HTML :)
$d = new DOMDocument;
$d->loadXML(''<script id="foo"><td>bar</td></script>'');
echo $d->saveHTML();
Pero, por supuesto, el marcado debe estar libre de errores para que loadXML funcione.