XPath 查找具有空值的属性
XPath find attributes with empty value
我使用 DOMDocument
加载 html,然后对其应用 DOMXPath
过滤器。这些对象是否有办法区分具有空字符串值的属性和没有值的属性?
<input required="">
<input required>
我知道在这两种情况下所需的属性在技术上都是正确的,但是当我调用 DOMDocument::saveHTML()
时,我可以看到它们如图所示。现在我只想过滤那些具有空字符串值的。我找到的最接近的解决方案是
$xpath = new DOMXPath($dom);
$xpath->query("//*[@*[string-length()=0]]");
但不幸的是,这也匹配没有值的属性。
正如我在评论中提到的,DOMDocument 将尝试从 HTML 生成有效的 XML 文档。据我所知,它不能正确支持 HTML5 没有值的样式属性。所以我不确定 XPath 是否适用于这种情况。
但在对文档底层的实际 DOM 进行一些实验后,似乎尽管该元素具有属性节点,但没有值的文本节点。
所以下面检查这种情况...
$a = '<input required="">
<input required>'
;
$dom = new DOMDocument();
$dom->loadHTML($a, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ( $xpath->query("//*[@*[string-length()=0]]") as $tag) {
if ( isset($tag->attributes[0]->firstChild) ){
echo "with attribute value:" . $dom->saveHTML($tag) . PHP_EOL;
}
else {
echo "without attribute value:" . $dom->saveHTML($tag) . PHP_EOL;
}
}
显示....
with attribute value:<input required="">
without attribute value:<input required>
刚刚注意到代码使用 attributes[0]
因为它纯粹是为了测试目的。您需要根据自己的需要进行更改。
我使用 DOMDocument
加载 html,然后对其应用 DOMXPath
过滤器。这些对象是否有办法区分具有空字符串值的属性和没有值的属性?
<input required="">
<input required>
我知道在这两种情况下所需的属性在技术上都是正确的,但是当我调用 DOMDocument::saveHTML()
时,我可以看到它们如图所示。现在我只想过滤那些具有空字符串值的。我找到的最接近的解决方案是
$xpath = new DOMXPath($dom);
$xpath->query("//*[@*[string-length()=0]]");
但不幸的是,这也匹配没有值的属性。
正如我在评论中提到的,DOMDocument 将尝试从 HTML 生成有效的 XML 文档。据我所知,它不能正确支持 HTML5 没有值的样式属性。所以我不确定 XPath 是否适用于这种情况。
但在对文档底层的实际 DOM 进行一些实验后,似乎尽管该元素具有属性节点,但没有值的文本节点。
所以下面检查这种情况...
$a = '<input required="">
<input required>'
;
$dom = new DOMDocument();
$dom->loadHTML($a, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ( $xpath->query("//*[@*[string-length()=0]]") as $tag) {
if ( isset($tag->attributes[0]->firstChild) ){
echo "with attribute value:" . $dom->saveHTML($tag) . PHP_EOL;
}
else {
echo "without attribute value:" . $dom->saveHTML($tag) . PHP_EOL;
}
}
显示....
with attribute value:<input required="">
without attribute value:<input required>
刚刚注意到代码使用 attributes[0]
因为它纯粹是为了测试目的。您需要根据自己的需要进行更改。