Экспорт определенного элемента в DOMDocument в строку - PullRequest
8 голосов
/ 02 ноября 2011

Я импортирую произвольный HTML-код в DOMDocument, используя функцию loadHTML(), например ::10000

$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument;
$doc->loadHTML($html);

Затем я хочу изменить несколько атрибутов / значений узлов, используя DOMDocument методы, с которыми я могу справиться без проблем.

После внесения этих изменений я хотел бы экспортировать строку HTML (используя ->saveHTML()), без тегов <html><body>..., которые DOMDocument автоматически добавляет в HTML.

Я понимаю, почему они добавляются (для обеспечения правильности документа), но как бы мне было просто вернуть отредактированный HTML-код (по сути, все между тегами <body>)?

Я прочитал этот пост , и хотя он предлагает некоторые решения, я бы предпочел сделать это "правильно", то есть без использования строковой замены в тегах <body>. Достоверность HTML не является проблемой, так как он проходит через очиститель HTML заранее.

Есть идеи? Спасибо.

EDIT

Мне известно о параметре $node, добавленном к saveHTML() в PHP 5.3.6, к сожалению, я застрял с 5.2.

Ответы [ 3 ]

4 голосов
/ 02 ноября 2011

Возможно, исходный код этого поможет - они используют регулярное выражение для удаления ненужных строк:

http://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/

$content = preg_replace(array("/^\<\!DOCTYPE.*?<html><body>/si",
                                  "!</body></html>$!si"),
                            "",
                            $this->saveHTML());

return $content;

saveHTMLExact () - DOMDocument имеет чрезвычайно плохо разработанную «функцию», при которой, если загружаемый HTML-код не содержит тегов <html> и <body>, он добавляет их автоматически (да, нет никаких флагов дляотключите это поведение).

Таким образом, когда вы вызываете $ doc-> saveHTML (), ваш недавно сохраненный контент теперь содержит <html><body> и DOCTYPE.Не очень удобно при попытке работать с фрагментами кода (в XML есть похожая проблема).

SmartDOMDocument содержит новую функцию saveHTMLExact (), которая делает именно то, что вам нужно - она ​​сохраняет HTML без добавления лишнего мусора, которыйDOMDocument делает.

Также другие вопросы задавали похожие вещи:

Как сохранить HTML DOMDocument без HTML-оболочки?

2 голосов
/ 02 ноября 2011

Попробуйте использовать DOMDocument-> saveXML ()?

<?php
$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$domnodelist = $doc->getElementsByTagName('p');
$domnode = $domnodelist->item(0);
echo $doc->saveXML($domnode);
?>

выводит <p><a href="test.php">Test</a></p>

0 голосов
/ 01 февраля 2017

Спасибо, но я не обязательно буду знать тип первого тега в теле, он должен быть общим

$domnodelist = $doc->getElementsByTagName('*');
$domnode = $domnodelist->item(0);
echo $doc->saveXML($domnode);
...