如何在不添加空格的情况下使用PHP DOMDocument saveHTML($ node)?

时间:2018-11-13 19:19:51

标签: php domdocument

如果我使用saveHTML()而不使用可选的DOMnode参数,则它会按预期工作:

$html = '<html><body><div>123</div><div>456</div></body></html>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = true;
$dom->formatOutput = false;
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD);
echo $dom->saveHTML();
<html><body><div>123</div><div>456</div></body></html>

但是当我添加一个DOMNode参数以输出文档的子集时,它似乎忽略了formatOutput属性,并添加了一堆不需要的空格:

$body = $dom->getElementsByTagName('body')->item(0);
echo $dom->saveHTML($body);
<body>
<div>123</div>
<div>456</div>
</body>

有什么作用?这是错误吗?有解决方法吗?

3 个答案:

答案 0 :(得分:5)

  

这是一个错误吗?

是的,这是一个错误,并且报告了here

  

有解决方法吗?

暂时坚持使用奈杰尔的解决方案

  

他们修复了吗?

是的,自7.3.0 alpha3起,这是一个已修复的错误

检查here

答案 1 :(得分:3)

如果您知道您的文档也将是有效的XML,则可以改用saveXML() ...

$html = '<html><body><div>123</div><div>456</div></body></html>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = true;
$dom->formatOutput = false;
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD);
$body = $dom->getElementsByTagName('body')->item(0);
echo $dom->saveXML($body);

这给...

<body><div>123</div><div>456</div></body>

答案 2 :(得分:2)

嗯,这是一个非常丑陋的解决方法,但是可以完成工作:

$html = '<html><body><div>123</div><div>456</div></body></html>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = true;
$dom->formatOutput = false;
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD);
$dom->loadHTML(str_replace("\n", "", $dom->saveHTML($dom->getElementsByTagName('body')->item(0))), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

echo $dom->saveHTML();

DEMO

由于saveHTML()返回字符串,因此将Node传递给该字符串,然后替换换行符,然后将其传递给loadHTML()