php DOMDocument使用DOCTYPE声明添加标头

时间:2011-03-26 18:54:45

标签: php domdocument

我正在通过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声明以及<head><body>标记。知道为什么会发生这种情况或我如何防止这种情况发生?

4 个答案:

答案 0 :(得分:5)

这是DOMDocument::saveHTML()通常所做的,是的:使用Doctype声明生成完整的HTML文档,<head>标记,...

两种可能的解决方案:

  • 如果您使用的是PHP&gt; = 5.3,saveHTML()会接受一个可能对您有帮助的附加参数
  • 如果您需要使用代码来使用PHP&lt; 5.3.6,你必须使用一些str_replace()或正则表达式或你能想到的任何等价物来删除你不需要的HTML代码部分。
    • 有关示例,请参阅手册用户备注中的this note

答案 1 :(得分:4)

真正的问题是DOM的加载方式。请改用: $html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

请选择原始答案here

答案 2 :(得分:2)

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

我使用的解决方案:

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

我正在使用PHP&gt; 5.4

答案 3 :(得分:0)

我通过创建新的DOMDocument并将子节点从原始节点复制到新节点来解决了这个问题。

return $dom->saveHTML();

因此无法使用

return removeDocType($dom);

我用:

dependencies {
.
.
.
.
.

    compile project(':google-play-services_libs')

   compile 'com.google.android.gms:play-services-analytics:7.3.0'
.
.
.
.

}