Como fazer o HTML5 funcionar com o DOMDocument?

Eu estou tentando analisar o código HTML com DOMDocument, fazer coisas como as alterações para ele, em seguida, montá-lo de volta para uma string que eu envio para a saída.

Mas há alguns problemas em relação à análise, o que significa que o que eu envio para o DOMDocument nem sempre retorna da mesma forma :)

Aqui está uma lista:

usando-> loadHTML:

formata o meu documento independentemente dapreserveWhitespace eformatOutput configurações (perdendo espaços em branco em texto pré-formatado)me dá erros quando eu tenho tags html5 como<header>, <footer> Mas eles podem ser suprimidos, então eu posso viver com isso.produz marcação inconsistente - por exemplo, se eu adicionar um<link ... /> elemento (com uma tag de fechamento automático), após a análise / saveHTML, a saída será<link .. >

usando-> loadXML:

codifica entidades como> de<style> ou<script> Tag:body > div torna-sebody &gt; divtodas as tags são fechadas da mesma maneira, por exemplo<meta ... /> torna-se<meta...></meta>; mas isso pode ser corrigido com um regex.

Eu não tentei HTML5lib mas eu prefiro DOMDocument em vez de um analisador personalizado por razões de desempenho

Atualizar:

Então, como o Honeymonster mencionado usando o CDATA, corrige o principal problema com o loadXML.

Existe alguma maneira que eu poderia impedir o fechamento automático de todas as tags HTML vazias além de um determinado conjunto, sem o uso de regex?

Agora eu tenho:

$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, mas também vai fazer as substituições no conteúdo CDATA, que eu não quero ...

questionAnswers(5)

yourAnswerToTheQuestion