PHP DOMDocument – obtenha a fonte html de BODY

Estou usando o DOMDocument do PHP para analisar e normalizar o HTML enviado pelo usuário usando o método loadHTML para analisar o conteúdo, obtendo um resultado bem formado via saveHTML :

 $dom= new DOMDocument(); $dom->loadHTML('

Hello World'); $well_formed= $dom->saveHTML(); echo($well_formed);

Isso faz um belo trabalho de analisar o fragment e adicionar as tags de fechamento apropriadas. O problema é que eu também estou obtendo um monte de tags que eu não quero, como , , e . Eu entendo que todo documento HTML bem formado precisa dessas tags, mas o fragment HTML que estou normalizando será inserido em um documento válido existente.

No seu caso, você não quer trabalhar com um documento HTML, mas com um fragment HTML – uma parte do código HTML ;; o que significa DOMDocument não é exatamente o que você precisa.

Em vez disso, prefiro usar algo como HTMLPurifier (citando) :

O HTML Purifier é uma biblioteca de filtros HTML compatível com padrões, escrita em PHP. O Purificador de HTML não só removerá todo o código malicioso (mais conhecido como XSS) com uma lista branca segura, ainda que permissiva, também irá certificar-se de que seus documentos são compatíveis com os padrões , algo que é possível alcançar com um conhecimento abrangente das especificações do W3C.

E, se você tentar a sua porção de código:

 

Hello World

Usando a página de demonstração do HTMLPurifier , você obtém esse HTML limpo como uma saída:

 

Hello World

Muito melhor, não é? 😉

(Note que o HTMLPurfier suporta uma ampla gama de opções e que dar uma olhada em sua documentação pode não doer)

A solução rápida para o seu problema é usar uma expressão xPath para pegar o corpo.

 $dom= new DOMDocument(); $dom->loadHTML('

Hello World'); $xpath = new DOMXPath($dom); $body = $xpath->query('/html/body'); echo($dom->saveXml($body->item(0)));

Uma palavra de advertência aqui. Às vezes, o loadHTML lançará um aviso quando encontrar documentos HTML, com certeza, mal formados. Se você estiver analisando esse tipo de documentos HTML, você precisará encontrar um melhor analisador html [aviso de auto-binding].

Diante do mesmo problema, criei um wrapper em torno do DOMDocument chamado SmartDOMDocument para superar isso e algumas outras deficiências (como problemas de codificação).

Você pode encontrá-lo aqui: http://beerpla.net/projects/smartdomdocument

Isso foi tirado de outro post e funcionou perfeitamente para o meu uso:

 $layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);