DOMDocument->saveHTML()
toma su infoset XML DOM y lo escribe como HTML de la vieja escuela, no XML. No debe usar saveHTML()
junto con un doctype XHTML, ya que su resultado no será un XML bien formado.
En cambio, si usa saveXML()
, obtendrá el XHTML adecuado. Está bien servir esta salida XML a los navegadores compatibles con estándares si le da un encabezado Content-Type: application/xhtml+xml
. Pero desafortunadamente IE6-8 no podrá leer eso, ya que solo pueden manejar HTML de la vieja escuela, bajo el tipo de medio text/html
.
La solución de compromiso habitual es servir text/html
y utilizar 'XHTML compatible con HTML' como se indica en el Apéndice C de la especificación XHTML 1.0. Pero lamentablemente no existe el método PHP DOMDocument->saveXHTML()
para generar el resultado correcto para esto.
Hay algunas cosas que puede hacer para persuadir saveXML()
para producir resultados compatibles con HTML para algunos casos comunes. La principal es que debe asegurarse de que solo los elementos definidos por HTML4 tengan un modelo de contenido EMPTY
(<img>
, <br>
, etc.) realmente tienen contenido vacío, lo que hace que se use la sintaxis de cierre automático (<img/>
). Otros elementos no deben usar la sintaxis de cierre automático, por lo que si están vacíos se debería poner un espacio en su contenido de texto para que dejen de ser tan:
<script src="x.js"/> <-- no good, confuses HTML parser and breaks page
<script src="x.js"> </script> <-- fine
El otro a tener en cuenta es el manejo de la en línea <script>
y <style>
elementos, que son elementos normales en XHTML pero especiales CDATA
-contenidos en HTML. Es necesario algún tipo de envoltura /*<![CDATA[*/.../*]]>*/
para que los caracteres <
o &
en su interior se comporten de manera consistente, aunque tenga en cuenta que debe evitar las secuencias ]]>
y </
.
Si realmente quiere hacerlo bien, tendría que escribir su propio serializador XHTML compatible con HTML. A largo plazo, esa sería probablemente una mejor opción. Pero para pequeños casos simples, piratear su entrada para que no contenga nada que pueda salir del otro lado de un serializador XML como incompatible con HTML es probablemente la solución más rápida.
Eso o simplemente aguántalo y convive con el HTML no XML de la vieja escuela, obviamente.
¿Has intentado agregar un doctype para ver qué pasa? – ceejayoz
Siempre he estado usando un doctype XHTML, pensé que no era relevante porque estoy cansado -_- – peterjwest