Я добавляю хеш #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>
. Любая идея, почему это происходит или как я могу это предотвратить?
Это то, что обычно делает DOMDocument::saveHTML()
, да: сгенерируйте полный HTML-документ с объявлением Doctype, <head>
, …
Два возможных решения:
saveHTML()
принимает один дополнительный параметр, который может помочь вам
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);