一尘不染

使用XPath选择CSS类

html

我只想自行选择一个名为.date的类

由于某种原因,我无法使它正常工作。如果有人知道我的代码出了什么问题,将不胜感激。

@$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc); // just to make xpath more simple
$images = $xml->xpath('//[@class="date"]');                             
foreach ($images as $img)
{
    echo  $img." ";
}

阅读 402

收藏
2020-05-10

共1个答案

一尘不染

我想写这个问题的规范答案,因为上面的答案有问题。

我们的问题

CSS 选择器:

.foo

将选择具有 foo 类的任何元素。

您如何在XPath中做到这一点?

尽管XPath比CSS强大,但是 XPath没有CSS类选择器的本机等效项 。但是,有一个解决方案。

正确的做法

XPath中 的等效选择器是:

//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]

该函数对空格进行归一化处理,以去除前导和尾随空格(并且还将空格字符序列替换为单个空格)。

(从更一般的意义上讲)这也等同于CSS选择器:

*[class~="foo"]

它将匹配任何其 属性值是由空格分隔的值的列表的元素,其中一个值与 foo 完全相等。

几种明显但错误的方法

XPath选择器:

//*[@class="foo"]

不起作用!例如,因为它不匹配具有多个类的元素

<div class="foo bar">

如果在类名周围有多余的空格,它也将不匹配:

<div class="  foo ">

“改进”的XPath选择器

//*[contains(@class, "foo")]

也不行!因为它错误地将元素与 foob​​ar 类匹配,例如

<div class="foobar">
2020-05-10