php DomDocument добавляет дополнительные теги
Я пытаюсь разобрать документ и получить все теги изображений и изменить источник для чего-то другого.
$domDocument = new DOMDocument();
$domDocument->loadHTML($text);
$imageNodeList = $domDocument->getElementsByTagName('img');
foreach ($imageNodeList as $Image) {
$Image->setAttribute('src', 'lalala');
$domDocument->saveHTML($Image);
}
$text = $domDocument->saveHTML();
$text изначально выглядит так:
<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>
и это вывод $text:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>
Я получаю кучу дополнительных тегов (html, body и комментарий вверху), которые мне действительно не нужны. Любой способ настроить DOMDocument, чтобы избежать добавления этих дополнительных тегов?
спасибо!
5 ответов
DomDocument, к сожалению, отстает и не позволит вам это сделать. Попробуйте это:
$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML()));
вам просто нужно добавить 2 флага в loadHTML()
способ: LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD
. Т. е.
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
посмотреть IDEONE demo:
$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>';
$domDocument = new DOMDocument;
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$imageNodeList = $domDocument->getElementsByTagName('img');
foreach ($imageNodeList as $Image) {
$Image->setAttribute('src', 'lalala');
$domDocument->saveHTML($Image);
}
$text = $domDocument->saveHTML();
echo $text;
выход:
<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p>
Если вы до взлома, это то, как мне удалось обойти это раздражение. Загрузите строку в формате XML и сохраните ее в формате HTML. :)
вы можете использовать http://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/ :
DOMDocument имеет чрезвычайно плохо спроектированную "функцию", где, если HTML-код, который вы загружаете, не содержит и теги, он добавляет их автоматически (да, нет флагов, чтобы отключить это поведение).
таким образом, когда вы вызываете $doc->saveHTML (), ваш недавно сохраненный контент теперь имеет и DOCTYPE в нем. Не очень удобно при работе с кодом фрагменты (XML имеет аналогичную проблему).
SmartDOMDocument содержит новую функцию saveHTMLExact (), которая делает именно то, что вы хотели бы – она сохраняет HTML без добавления дополнительного мусора, который делает DOMDocument.
Если вы собираетесь сохранить как HTML, вы должны ожидать, что будет создан действительный HTML-документ!
есть еще один вариант: DOMDocument::saveXML
имеет необязательный параметр, позволяющий получить доступ к XML-содержимому определенного элемента:
$el = $domDocument->getElementsByTagName('p')->item(0);
$text = $domDocument->saveXML($el);
Это предполагает, что ваш контент имеет только один p
элемент.