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] 因为它纯粹是为了测试目的。您需要根据自己的需要进行更改。