【问题标题】:What does LIBXML_NOBLANKS do, exactly?LIBXML_NOBLANKS 究竟做了什么?
【发布时间】:2021-01-01 15:46:24
【问题描述】:

有什么区别

$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-parsing html-parsing libxml2


    【解决方案1】:

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

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

    通常,元素doc 具有三个子节点:一个空白文本节点、元素elem 和另一个空白文本节点。使用LIBXML_NOBLANKS 解析时,doc 元素将只有一个子元素。

    【讨论】:

    • 是有道理的,但这不是故事的全部,以&lt;doc&gt;&lt;elem&gt; &lt;/elem&gt;&lt;/doc&gt;为例-elem中的单个空格使libxml创建一个仅包含空格的textNode,即使使用LIBXML_NOBLANKS,参见3v4l.org/gXHvV
    • @hanshenrik 对,如果“空白”节点是唯一的孩子,似乎会有一个例外。不幸的是,这在任何地方都没有正确记录。您必须查看源代码。
    猜你喜欢
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    • 2019-10-06
    • 2011-11-09
    相关资源
    最近更新 更多