Подтвердить что ты не робот

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

4b9b3361

Ответ 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);