如果我使用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>
有什么作用?这是错误吗?有解决方法吗?
答案 0 :(得分:5)
答案 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();
由于saveHTML()
返回字符串,因此将Node传递给该字符串,然后替换换行符,然后将其传递给loadHTML()
。