PHP DOMDocument – получить html источник BODY

Я использую DOMDocument PHP для анализа и нормализации представленного пользователем HTML с loadHTML метода loadHTML для синтаксического анализа содержимого, а затем получения корректного результата с помощью saveHTML :

 $dom= new DOMDocument(); $dom->loadHTML('<div><p>Hello World'); $well_formed= $dom->saveHTML(); echo($well_formed); 

Это делает красивую работу по разбору фрагмента и добавлению соответствующих закрывающих тегов. Проблема в том, что я также получаю кучу тегов, которые мне не нужны, такие как <!DOCTYPE> , <html> , <head> и <body> . Я понимаю, что каждый хорошо сформированный HTML-документ нуждается в этих тегах, но фрагмент HTML, который я нормализую, будет вставлен в существующий действительный документ.

Related of "PHP DOMDocument – получить html источник BODY"

В вашем случае вы не хотите работать с HTML-документом, но с фрагментом HTML – частью HTML-кода ;; что означает, что DOMDocument не совсем то, что вам нужно.

Вместо этого я предпочел бы использовать что-то вроде HTMLPurifier (цитирование) :

HTML Purifier – это стандартная библиотека фильтров HTML, написанная на PHP. HTML-очиститель не только удалит весь вредоносный код (более известный как XSS) с тщательно проверенным, безопасным, но и разрешенным «белым списком», он также гарантирует, что ваши документы совместимы со стандартами , что только достижимо с полным знанием спецификаций W3C.

И, если вы попробуете свою часть кода:

 <div><p>Hello World 

Используя демонстрационную страницу HTMLPurifier , вы получаете этот чистый HTML как результат:

 <div><p>Hello World</p></div> 

Гораздо лучше, не так ли? 😉

(Обратите внимание, что HTMLPurfier поддерживает широкий спектр опций и что просмотр документации может не повредить)

Быстрое решение вашей проблемы – использовать выражение xPath для захвата тела.

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

Слово предупреждения здесь. Иногда loadHTML будет вызывать предупреждение, когда он сталкивается с определенно плохо сформированными документами HTML. Если вы разбираете эти HTML-документы, вам нужно найти лучший html-парсер [предупреждение о собственной ссылке].

Столкнувшись с той же проблемой, я создал обертку вокруг DOMDocument под названием SmartDOMDocument для преодоления этого и некоторых других недостатков (таких как проблемы с кодировкой).

Вы можете найти его здесь: http://beerpla.net/projects/smartdomdocument

Это было взято из другого сообщения и отлично работало для моего использования:

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