我正在通过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>
标记。知道为什么会发生这种情况或我如何防止这种情况发生?
答案 0 :(得分:5)
这是DOMDocument::saveHTML()
通常所做的,是的:使用Doctype声明生成完整的HTML文档,<head>
标记,...
两种可能的解决方案:
saveHTML()
会接受一个可能对您有帮助的附加参数
str_replace()
或正则表达式或你能想到的任何等价物来删除你不需要的HTML代码部分。
答案 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'
.
.
.
.
}