php文档添加<;html>;带有DOCTYPE声明的标题

php文档添加<;html>;带有DOCTYPE声明的标题,php,domdocument,Php,Domdocument,我正在通过DOMDocument类向每个链接添加一个#b散列 $dom = new DOMDocument(); $dom->loadHTML($output); $a_tags = $dom->getElementsByTagName('a'); foreach($a_tags as $a) { $value = $a->getAttribute('href');

我正在通过DOMDocument类向每个链接添加一个#b散列

        $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
声明和
标记。知道为什么会发生这种情况,或者我可以如何防止这种情况发生吗?

通常就是这样,是的:生成一个完整的HTML文档,带有Doctype声明,
标记

两种可能的解决办法:

  • 如果您使用的是PHP>=5.3,
    saveHTML()
    会接受一个可能对您有所帮助的附加参数
    • 有关更多信息,请参阅
  • 如果您需要使用PHP<5.3.6的代码,则必须使用一些
    str_replace()
    或regex或任何您能想到的等效工具来删除不需要的HTML代码部分。
    • 有关示例,请参见手册的用户说明中的

添加
$doc->saveHTML(false)将不起作用,它将返回一个错误,因为它需要一个节点而不是bool

我使用的解决方案是:

返回preg_replace('/^/','',str_replace(数组('','',''),数组('','',''),$doc->saveHTML())


我使用的是PHP>5.4,真正的问题是DOM的加载方式。改用这个:

$html->loadHTML($content,LIBXML\u html\u noimpled | LIBXML\u html\u NODEFDTD);


请更新原始答案。

我通过创建新的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);

第二个链接对我来说很好-preg_替换解决方案是关键!非常感谢。不客气:-)我使用了第一个选项,因为我使用的是PHP>=5.3,效果非常好<代码>$doc->saveHTML(false)
@BenSinclair我也在使用PHP>=5.3和
$doc->saveHTML(false)
抛出错误
警告:DOMDocument::saveHTML()期望参数1是DOMNode,布尔值给定的
可能重复的