如何防止 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;
}