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

时间:2016-07-11 23:45:58

标签: php domdocument

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

1 个答案:

答案 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;
}