Estoy intentando analizar el código HTML con DOMDocument, hacer cosas como cambios en él, luego volver a montarlo en una cadena que envíe a la salida.¿Cómo hacer que HTML5 funcione con DOMDocument?
Pero hay algunos problemas en relación con el análisis, lo que significa que lo que envío a DOMDocument no siempre viene de vuelta en la misma forma :)
He aquí una lista:
usando ->loadHTML:
- formatea mi documento independientemente de las configuraciones
preserveWhitespace
yformatOutput
(perdiendo espacios en blanco en el texto preformateado) - me da errores cuando tengo etiquetas html5 como
<header>
,<footer>
etc. Pero pueden suprimirse, así que puedo vivir con esto. - produce marcado inconsistente - por ejemplo, si agrego un elemento
<link ... />
(con una etiqueta de cierre automático), después de análisis sintáctico/saveHTML la salida será<link .. >
- formatea mi documento independientemente de las configuraciones
usando ->loadXML:
- codifica entidades como
>
desde<style>
o<script>
etiquetas:body > div
se convierte enbody > div
- todas las etiquetas se cierran de la misma manera, por ejemplo
<meta ... />
se convierte en<meta...></meta>
; pero esto se puede arreglar con una expresión regular.
- codifica entidades como
no lo probé HTML5lib pero preferiría DOMDocument en lugar de un analizador personalizado por razones de rendimiento
Actualización:
Así como el Honeymonster menciona el uso de correcciones CDATA el problema principal con loadXML.
¿Hay alguna manera de evitar el cierre automático de todas las etiquetas HTML vacías además de un cierto conjunto, sin usar expresiones regulares?
Ahora mismo tengo:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');
// if a element that is not in the above list is empty,
// it should close like `<element></element>` (for eg. empty `<title>`)
return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}></{$matches[1]}>";
}, $html);
que trabaja pero también hará las sustituciones en el contenido CDATA, que no quiero ...
¿Tiene un fragmento de prueba con el que podamos jugar? –
¿Cómo sabes que html5lib es más lento que DOMDocument si ni siquiera lo intentaste? – Brad
Supongo que porque está escrito en PHP ... DOMDocument es una extensión de PHP escrita en C – Alex