Я использую 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, который я нормализую, будет вставлен в существующий действительный документ.
В вашем случае вы не хотите работать с 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);