提问人:hanshenrik 提问时间:9/15/2020 最后编辑:hanshenrik 更新时间:5/25/2022 访问量:966
LIBXML_NOBLANKS到底是做什么的?
What does LIBXML_NOBLANKS do, exactly?
问:
两者之间有什么区别
$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);
答:
1赞
nwellnhof
9/18/2020
#1
解析器选项删除所有仅包含空格的文本节点。请考虑以下文档,例如:LIBXML_NOBLANKS
<doc>
<elem>text</elem>
</doc>
通常,该元素有三个子元素:一个空格文本节点、元素和另一个空格文本节点。解析 时,元素将只有一个子元素。doc
elem
LIBXML_NOBLANKS
doc
评论
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 中找到更多可访问的问答,这似乎可能与无关紧要的空白不同。
评论