Intereting Posts
Проблема с php yii с объектами Php if ($ _ POST) vs if (isset ($ _ POST)) Запрос Mysql: получение запроса текущей даты Как вытащить данные из вложенного массива в PHP? PHP-кодирование с помощью DOMDocument Что еще может создавать PHP помимо веб-сайтов? Отправить zip-файл в браузер / force Почему у меня должно быть значение utf8_decode () моего столбца MySQL, чтобы оно отображалось правильно? WooCommerce – Условная прогрессивная скидка, основанная на количестве товаров в корзине Elasticsearch – предыдущая / следующая функциональность быстрый способ получить родительский ключ массива в многомерных массивах с php Как найти заголовок раздела в платформе Magento? Можно ли передать массив в качестве аргумента командной строки в PHP-скрипт? Почему этот код для центрирования текста в PDF-формате с использованием библиотеки PHP Zend_Pdf не работает? Symfony2 – Невозможно назначить роли для пользователя (массив ролей пуст)

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(); 

Первоначально текст $ выглядит так:

 
 

<p> Привет, это тест, вот изображение <img src = "http://mysite.com/beer.jpg" width = "60" height = "95" /> Потому что мне нравится Beer! </ р>

и это вывод $ text:

 
 

<! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.0 Transitional // EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html> <body> <p> Привет, это тест, вот изображение <img src = "lalala" width = "68" height = "95"> Потому что мне нравится Beer! </ p> </ body > </ html>

Я получаю кучу дополнительных тегов (html, body и комментарий вверху), которые мне действительно не нужны. Любой способ настроить DOMDocument, чтобы не добавлять эти дополнительные теги?

Спасибо!

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 :

 $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 .