¿Cómo hacer funcionar HTML5 con DOMDocument?

Estoy intentando analizar código HTML con DOMDocument, hacer cosas como cambios en él y luego volver a ensamblarlo en una cadena que envío a la salida.

Pero hay algunos problemas relacionados con el análisis, lo que significa que lo que envío a DOMDocument no siempre vuelve de la misma forma :)

Aquí hay una lista:

utilizando-> loadHTML:

formatea mi documento independientemente de lapreserveWhitespace yformatOutput Configuraciones (perdiendo espacios en blanco en texto preformateado)me da errores cuando tengo etiquetas html5 como<header>, <footer> Pero pueden ser suprimidos, así que puedo vivir con esto.produce un marcado inconsistente, por ejemplo, si agrego un<link ... /> elemento (con una etiqueta de cierre automático), después de analizar / guardar HTML, la salida será<link .. >

utilizando-> loadXML:

codifica entidades como> desde<style> o<script> etiquetas:body > div se convierte enbody &gt; divTodas las etiquetas están cerradas de la misma manera, por ejemplo.<meta ... /> se convierte en<meta...></meta>; pero esto se puede arreglar con una expresión regular.

No probé HTML5lib pero preferiría DOMDocument en lugar de un analizador personalizado por razones de rendimiento

Actualizar:

Así como el Honeymonster mencionado usando CDATA corrige 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 conjunto determinado, 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 funciona pero también hará los reemplazos en el contenido CDATA, que no quiero ...

Respuestas a la pregunta(5)

Su respuesta a la pregunta