PHP DOMDocument - получить html источник BODY
Я использую PHP DOMDocument для анализа и нормализации представленного пользователем HTML с помощью метода loadHTML
для синтаксического анализа содержимого, а затем получения корректного результата с помощью saveHTML
:
$dom= new DOMDocument();
$dom->loadHTML('<div><p>Hello World');
$well_formed= $dom->saveHTML();
echo($well_formed);
Это делает красивую работу по разбору фрагмента и добавлению соответствующих закрывающих тегов. Проблема в том, что я также получаю кучу тегов, которые я не хочу, таких как <!DOCTYPE>
, <html>
, <head>
и <body>
. Я понимаю, что каждый хорошо сформированный HTML-документ нуждается в этих тегах, но фрагмент HTML, который я нормализую, будет вставлен в существующий действительный документ.
Ответы
Ответ 1
В вашем случае вы не хотите работать с HTML-документом, но с фрагментом HTML - частью HTML-кода;; что означает, что DOMDocument не совсем то, что вам нужно.
Вместо этого я предпочел бы использовать что-то вроде HTMLPurifier (цитирование):
HTML-очиститель - это стандартно-совместимый Библиотека HTML-фильтра, написанная на PHP. Очиститель HTML не только удалит все вредоносный код (более известный как XSS) с тщательно проверенной, надежной разрешающий белый список, он также убедитесь, что ваши документы соответствуют стандартам, что-то только достижимых с помощью всеобъемлющего знание спецификаций W3C.
И, если вы попробуете свою часть кода:
<div><p>Hello World
Используя демонстрационную страницу HTMLPurifier, вы получите этот чистый HTML как результат:
<div><p>Hello World</p></div>
Гораздо лучше, не так ли?; -)
(Обратите внимание, что HTMLPurfier поддерживает широкий диапазон опций и что просмотр его документации может не повредить)
Ответ 2
Быстрое решение вашей проблемы - использовать выражение 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-парсер. [Self link warning].
Ответ 3
Столкнувшись с той же проблемой, я создал оболочку DOMDocument под названием SmartDOMDocument, чтобы преодолеть это и некоторые другие недостатки (например, проблемы с кодировкой).
Вы можете найти его здесь: http://beerpla.net/projects/smartdomdocument
Ответ 4
Это было взято из другого сообщения и отлично работало для моего использования:
$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout);