Я импортирую некоторый произвольный HTML в DOMDocument
используя loadHTML()
, например:
$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 перед началом работы.
Есть идеи? Благодарю.
РЕДАКТИРОВАТЬ
Я знаю параметр $node
добавленный в saveHTML()
в PHP 5.3.6, к сожалению, я застрял с 5.2.
Возможно, исходный код этого поможет – они используют регулярное выражение для выделения ненужных строк:
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>
, он автоматически добавляет их (yup, флаги не отключены) ,
Таким образом, когда вы вызываете $ doc-> saveHTML (), ваш недавно сохраненный контент теперь имеет <html><body>
и DOCTYPE
. Не очень удобно при попытке работать с фрагментами кода (аналогичная проблема с XML).
SmartDOMDocument содержит новую функцию saveHTMLExact (), которая делает именно то, что вы хотите – она сохраняет HTML без добавления лишнего мусора, который делает DOMDocument.
Кроме того, другие вопросы задавали аналогичные вопросы:
Как сохранитьHTML DOMDocument без оболочки HTML?
Попробуйте использовать 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>
Спасибо, но я не обязательно буду знать тип первого тега в теле, он должен быть общим
$domnodelist = $doc->getElementsByTagName('*'); $domnode = $domnodelist->item(0); echo $doc->saveXML($domnode);