php文档添加<;html>;带有DOCTYPE声明的标题
我正在通过DOMDocument类向每个链接添加一个#b散列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');
$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的代码,则必须使用一些
或regex或任何您能想到的等效工具来删除不需要的HTML代码部分。str_replace()
- 有关示例,请参见手册的用户说明中的
$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,布尔值给定的
可能重复的