如何在不添加空格的情况下使用 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();
由于 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
如果我使用 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();
由于 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