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

How to use PHP DOMDocument saveHTML($node) without added whitespace?

如果我使用 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>

什么给了?这是一个错误吗?有解决方法吗?

好吧,这是一个非常丑陋的解决方法,但它完成了工作:

$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() returns 字符串,将节点传递给它,然后替换换行符,然后将其传递给 loadHTML().

如果您知道您的文档也将有效 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>

Is this a bug?

是的,这是一个错误,已报告 here

Is there a workaround?

暂时坚持 Nigel 的解决方案

Did they fix it?

是的,从 7.3.0 alpha3 开始,这是一个已修复的错误

检查一下here