Как использовать PHP DOMDocument saveHTML ($ node) без добавления пробелов? - PullRequest
0 голосов
/ 13 ноября 2018

Если я использую 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 голосов
/ 13 ноября 2018

Если вы знаете, что ваш документ также будет действительным 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>
0 голосов
/ 14 ноября 2018

Это ошибка?

Да, это ошибка, и о ней сообщается здесь

Есть ли обходной путь?

Придерживайтесь решения Найджела на данный момент

Они это исправили?

Да, с 7.3.0 alpha3 это исправленная ошибка

Проверьте это здесь

0 голосов
/ 13 ноября 2018

Ну, это довольно уродливый обходной путь, но он выполняет свою работу:

$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().

...