LIBXML_NOBLANKS到底是做什么的?

What does LIBXML_NOBLANKS do, exactly?

提问人:hanshenrik 提问时间:9/15/2020 最后编辑:hanshenrik 更新时间:5/25/2022 访问量:966

问:

两者之间有什么区别

$domd=new DOMDocument();
$domd->loadHTML($html, LIBXML_NOBLANKS);

$domd=new DOMDocument();
$domd->loadHTML($html, 0);

?

编辑:以防万一有人想删除所有空+空格文本节点(这并不完全是LIBXML_NOBLANKS所做的),这里有一个函数可以做到这一点,

$removeAnnoyingWhitespaceTextNodes = function (\DOMNode $node) use (&$removeAnnoyingWhitespaceTextNodes): void {
    if ($node->hasChildNodes()) {
        // Warning: it's important to do it backwards; if you do it forwards, the index for DOMNodeList might become invalidated;
        // that's why i don't use foreach() - don't change it (unless you know what you're doing, ofc)
        for ($i = $node->childNodes->length - 1; $i >= 0; --$i) {
            $removeAnnoyingWhitespaceTextNodes($node->childNodes->item($i));
        }
    }
    if ($node->nodeType === XML_TEXT_NODE && !$node->hasChildNodes() && !$node->hasAttributes() && (strlen(trim($node->textContent)) === 0)) {
        //echo "Removing annoying POS";
        // var_dump($node);
        $node->parentNode->removeChild($node);
    } //elseif ($node instanceof DOMText) { echo "not removed"; var_dump($node, $node->hasChildNodes(), $node->hasAttributes(), trim($node->textContent)); }
};
$dom=new DOMDocument();
$dom->loadHTML($html);
$removeAnnoyingWhitespaceTextNodes($dom);
php xml html 解析 libxml2

评论


答:

1赞 nwellnhof 9/18/2020 #1

解析器选项删除所有仅包含空格的文本节点。请考虑以下文档,例如:LIBXML_NOBLANKS

<doc>
    <elem>text</elem>
</doc>

通常,该元素有三个子元素:一个空格文本节点、元素和另一个空格文本节点。解析 时,元素将只有一个子元素。docelemLIBXML_NOBLANKSdoc

评论

1赞 hanshenrik 9/18/2020
这是有道理的,但这不可能是故事的全部,以 - elem 中的单个空格使 libxml 创建一个仅包含空格的 textNode,即使有LIBXML_NOBLANKS,请参阅 3v4l.org/gXHvV<doc><elem> </elem></doc>
0赞 nwellnhof 9/18/2020
@hanshenrik 是的,如果“空白”节点是唯一的子节点,则似乎存在异常。不幸的是,这在任何地方都没有正确记录。你必须看看源代码。
1赞 hakre 5/25/2022 #2

可能:

LIBXML_NOBLANKS删除文档中所有无关紧要的空格。

但是,我没有发现明确的迹象表明这个(借来的)描述与PHP文档中的内容100%吻合:

LIBXML_NOBLANKS (int)

删除空白节点

这让我很惊讶,我想这里的参考是 libxml2

XML_PARSE_NOBLANKS = 256 : remove blank nodes

我可以在 https://stackoverflow.com/a/18521956/367456 中找到更多可访问的问答,这似乎可能与无关紧要的空白不同。