'php DOMDocument adds <html> headers with DOCTYPE declaration
I'm adding a #b hash to each link via the DOMDocument class.
$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();
That works fine, however the returned output includes a DOCTYPE declaration and a <head> and <body> tag. Any idea why that happens or how I can prevent that?
Solution 1:[1]
The real problem is the way the DOM is loaded. Use this instead:
$html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
Please upvote the original answer here.
Solution 2:[2]
Adding $doc->saveHTML(false); will not work and it will return a error because it expects a node and not bool.
The solution I used:
return preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));
I`m using PHP >5.4
Solution 3:[3]
I solved this problem by creating new DOMDocument and copying child nodes from original to new one.
function removeDocType($oldDom) {
$node = $oldDom->documentElement->firstChild
$dom = new DOMDocument();
foreach ($node->childNodes as $child) {
$dom->appendChild($doc->importNode($child, true));
}
return $dom->saveHTML();
}
So insted of using
return $dom->saveHTML();
I use:
return removeDocType($dom);
Solution 4:[4]
I was in the case where I want the html wrapper but not the DOCTYPE, the solution was in line with Tiago A.:
// Avoid adding the DOCTYPE header
$dom->loadHTML($bodyContent, LIBXML_HTML_NODEFDTD);
// Avoid adding the DOCTYPE header AND html/body wrapper
$dom->loadHTML($bodyContent, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Bender the Greatest |
| Solution 2 | |
| Solution 3 | Sigismund |
| Solution 4 | Yhensel Benitez Tapia |
