将DOMDocument中的特定元素导出为字符串

时间:2011-11-02 10:26:23

标签: php html domdocument

我正在使用DOMDocument函数将一些任意HTML导入loadHTML(),例如:

$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument;
$doc->loadHTML($html);

然后我想使用DOMDocument方法更改一些属性/节点值,我可以毫无问题。

我做了这些更改之后,我想要导出HTML字符串(使用->saveHTML()),而不 <html><body>... DOMDocument标记<body>自动添加到HTML。

我理解为什么会添加这些内容(以确保有效的文档),但我如何才能将我编辑过的HTML恢复(基本上是<body>标记之间的所有内容)?

我已阅读this post虽然它提供了一些解决方案,但我宁愿“正确”执行此操作,即不在$node标记上使用字符串替换。 HTML的有效性不是问题,因为它预先通过HTML净化器运行。

有什么想法吗?感谢。

修改

我知道在PHP 5.3.6中saveHTML()添加了{{1}}参数,不幸的是我坚持使用5.2。

3 个答案:

答案 0 :(得分:4)

也许这个source code会有所帮助 - 他们正在使用正则表达式删除不必要的字符串:

http://beerpla.net/projects/smartdomdocument-a-smarter-php-domdocument-class/

$content = preg_replace(array("/^\<\!DOCTYPE.*?<html><body>/si",
                                  "!</body></html>$!si"),
                            "",
                            $this->saveHTML());

return $content;

saveHTMLExact() - DOMDocument设计极其糟糕的“功能”,如果您加载的HTML代码不包含<html><body>标记,则会添加它们自动(是的,没有标志可以关闭此行为)。

因此,当您调用$ doc-&gt; saveHTML()时,您新保存的内容现在包含<html><body>DOCTYPE。尝试使用代码片段时不是很方便(XML有类似的问题)。

SmartDOMDocument包含一个名为saveHTMLExact()的新函数,它可以完全满足您的需要 - 它可以保存HTML而不会添加DOMDocument所做的额外垃圾。

此外,其他问题也提出了类似的问题:

How to saveHTML of DOMDocument without HTML wrapper?

答案 1 :(得分:2)

尝试使用DOMDocument-&gt; saveXML()?

<?php
$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$domnodelist = $doc->getElementsByTagName('p');
$domnode = $domnodelist->item(0);
echo $doc->saveXML($domnode);
?>

输出<p><a href="test.php">Test</a></p>

答案 2 :(得分:-1)

谢谢,但我不一定知道正文中第一个标记的类型,它需要是通用的

$domnodelist = $doc->getElementsByTagName('*');
$domnode = $domnodelist->item(0);
echo $doc->saveXML($domnode);