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 > div
todas 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 ...