Intereting Posts
убедитесь, что результат метода выборки PDO «false» – это ошибка или пустой результат Почему я получаю сообщение об ошибке «Ошибка перенаправления страницы»? Проверка буферизации вывода PHP? RNCryptor AES256 соответствует PHP MCRYPT_RIJNDAEL_256 Вытягивание изображения из пользовательской таксономии с помощью ACF получение специальных символов из базы данных mysql, php Почему тело ответа HTTP содержит «2fb» в начале? Как получить cookie, установленный файлом htaccess при первой загрузке PHP: получение «использования неопределенного константы COOKIE_LOGIN», как я могу это исправить? facebook getUser () на вкладке страницы вентилятора iframe показывает внутреннюю ошибку сервера только в IE PHP создает HTML-таблицу из базы данных Разбор строки SQL Как заменить каждый другой экземпляр определенного символа в строке MySQL? Вызов неопределенной функции password_hash () Массив блока checkbox возвращает NULL

php DOMDocument добавляет заголовки <html> с объявлением DOCTYPE

Я добавляю хеш #b для каждой ссылки через класс DOMDocument.

$dom = new DOMDocument(); $dom->loadHTML($output); $a_tags = $dom->getElementsByTagName('a'); foreach($a_tags as $a) { $value = $a->getAttribute('href'); $a->setAttribute('href', $value . '#b'); } return $dom->saveHTML(); 

Это работает отлично, однако возвращаемый вывод включает объявление DOCTYPE и <head> и <body> . Любая идея, почему это происходит или как я могу это предотвратить?

Related of "php DOMDocument добавляет заголовки <html> с объявлением DOCTYPE"

Это то, что обычно делает DOMDocument::saveHTML() , да: сгенерируйте полный HTML-документ с объявлением Doctype, <head> , …

Два возможных решения:

  • Если вы работаете с PHP> = 5.3, saveHTML() принимает один дополнительный параметр, который может помочь вам
    • см . DOM Goodie в PHP 5.3.6 для получения дополнительной информации.
  • Если вам нужен ваш код для работы с PHP <5.3.6, вам нужно будет использовать некоторое str_replace() или регулярное выражение или любой эквивалент, который вы можете себе представить, чтобы удалить часть кода HTML, который вам не нужен.
    • Например, см. Это примечание в примечаниях пользователей руководства.

Реальная проблема заключается в том, как загружается DOM. Используйте это вместо: $html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

Пожалуйста, подтвердите первоначальный ответ здесь .

Добавление $doc->saveHTML(false); не будет работать, и он вернет ошибку, потому что ожидает узел, а не bool.

Решение, которое я использовал:

return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));

Я использую PHP> 5.4

Я решил эту проблему, создав новый DOMDocument и скопировав дочерние узлы от исходного к новому.

 function removeDocType($oldDom) { $node = $oldDom->documentElement->firstChild $dom = new DOMDocument(); foreach ($node->childNodes as $child) { $dom->appendChild($doc->importNode($child, true)); } return $dom->saveHTML(); } 

Таким образом,

 return $dom->saveHTML(); 

Я использую:

 return removeDocType($dom);