php DOMDocument добавляет <html>заголовки с объявлением DOCTYPE - PullRequest
9 голосов
/ 26 марта 2011

Я добавляю хэш #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>. Есть идеи, почему это происходит или как я могу это предотвратить?

Ответы [ 4 ]

5 голосов
/ 26 марта 2011

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

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

  • Если вы работаете с PHP> = 5.3, saveHTML() принимает один дополнительный параметр, который может вам помочь
  • Если вам нужен ваш код для работы с PHP <5.3.6, вам придется использовать некоторые <code>str_replace() или регулярные выражения или любой другой эквивалент, который вы можете себе представить, чтобы удалить части кода HTML, которые вам не нужны.
4 голосов
/ 09 декабря 2015

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

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

2 голосов
/ 20 февраля 2014

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

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

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

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

0 голосов
/ 30 марта 2016

Я решил эту проблему, создав новый 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);
...