DOMDocument 在节点之间添加换行符,其中节点之间没有任何内容


DOMDocument adds the line break between nodes where there is nothing between the nodes

如何防止 DOMDocument 在第一段节点后添加换行符'n?当节点之间有空格时,不会添加换行符。

<?php
$text = '<p></p><p></p>';
$dom = new 'DOMDocument();
$dom->loadHTML($text);
$innerHTML = "";
foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $child) {
    $innerHTML .= $dom->saveHTML($child);
}
echo json_encode($innerHTML);

上面的代码返回:

"<p><'/p>'n<p><'/p>"

那里有在线代码 https://3v4l.org/UfZTG

我今天遇到了这个问题。我的用例似乎是相同的,即从元素生成"内部 HTML"字符串。因为我不想不分青红皂白地更改或修剪节点的空白,所以我找到了不同的解决方案。

DOMDocumentFragment上运行DOMDocument::saveHTML(在我的测试中)似乎永远不会增加任何额外的空格。

从您的示例中,您可以通过执行以下操作来获取第一个P元素的 HTML 输出,而无需尾随'n

$frag = $dom->createDocumentFragment();
$frag->appendChild(
    $dom->getElementsByTagName('p')->item(0)->cloneNode(true)
);
echo json_encode($dom->saveHTML($frag)); // Renders "<p><'/p>".

请注意,您必须使用 DOMNode::cloneNode ,否则会将元素移动到DOMDocumentFragment中并将其从其原始位置删除。

如果您正在寻找内部 HTML 函数,以下内容应该有效。它将一个元素的所有子节点移动到一个DOMDocumentFragment中,然后获取HTML值,并将节点放回它们所属的位置。这意味着我们不会克隆笔记,也不会在完成后更改树。

function innerHTML('DOMElement $element): string
{
    $fragment = $element->ownerDocument->createDocumentFragment();
    while ($element->hasChildNodes()) {
        $fragment->appendChild($element->firstChild);
    }
    $html = $element->ownerDocument->saveHTML($fragment);
    $element->appendChild($fragment);
    return $html;
}