PHP DOMDocument - получить HTML-источник тела - PullRequest
17 голосов
/ 27 февраля 2010

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

Ответы [ 4 ]

23 голосов
/ 27 февраля 2010

Быстрое решение вашей проблемы - использовать выражение 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-парсер [предупреждение о собственной ссылке].

3 голосов
/ 27 февраля 2010

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

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

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

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

<div><p>Hello World

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

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

Намного лучше, не так ли? ; -)

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

1 голос
/ 12 марта 2010

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

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

0 голосов
/ 04 января 2014

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

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