如何防止 DOMDocument 在第一个段落节点之后添加换行符"<p><\/p>\n<p><\/p>"
?当节点之间有空格时,不会添加换行符。
sqlite> explain query plan select message_id, server_timestamp from messages group by message_id order by server_timestamp;
selectid|order|from|detail
0|0|0|SCAN TABLE messages USING COVERING INDEX index_messages_id_server_timestamp
0|0|0|USE TEMP B-TREE FOR ORDER BY
上面的代码返回:
i
那里有在线代码https://3v4l.org/UfZTG
答案 0 :(得分:0)
我今天遇到了这个问题。我的用例似乎是相同的,即从元素生成“内部HTML”字符串。因为我不想从节点中不加选择地改变或修剪空白区域,所以我找到了不同的解决方案。
在DOMDocument::saveHTML
上运行DOMDocumentFragment
(在我的测试中)似乎永远不会添加任何额外的空白区域。
从您的示例开始,您可以通过执行以下操作获取第一个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;
}