选择带有xpath的css类

Ted*_*y13 80 html php xml xpath web

我想只选择一个名为.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." ";
}
Run Code Online (Sandbox Code Playgroud)

小智 232

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

我们的问题

CSS选择器:

.foo
Run Code Online (Sandbox Code Playgroud)

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

你是如何在XPath中做到这一点的?

虽然XPath比CSS更强大,但XPath没有CSS类选择器的本机等价物.但是,有一个解决方案.

正确的方法

XPath中的等效选择器是:

//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Run Code Online (Sandbox Code Playgroud)

函数normalize-space剥离前导和尾随空格(并且还用单个空格替换空白字符序列).

(在更一般的意义上)这也是CSS选择器的等价物:

*[class~="foo"]
Run Code Online (Sandbox Code Playgroud)

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

一些明显但错误的方法

XPath选择器:

//*[@class="foo"]
Run Code Online (Sandbox Code Playgroud)

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

<div class="foo bar">
Run Code Online (Sandbox Code Playgroud)

如果类名周围有任何额外的空格,它也不匹配:

<div class="  foo ">
Run Code Online (Sandbox Code Playgroud)

'改进的'XPath选择器

//*[contains(@class, "foo")]
Run Code Online (Sandbox Code Playgroud)

也不起作用!因为它错误地匹配与类元素foob​​ar的,例如

<div class="foobar">
Run Code Online (Sandbox Code Playgroud)

感谢这位家伙,他是我在网上找到的最早发布的解决这个问题的解决方案:http: //dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes-在-xpathxslt /


MrG*_*ass 11

//[@class="date"] 不是有效的xpath.

试试//*[@class="date"],或者如果你知道它是一个图像,//img[@class="date"]


Rob*_*rny 7

XPath 3.1引入了一个函数contains-token,因此最终解决了这个"正式"问题.它旨在支持类.

例:

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

此功能可确保正确处理空白区域(不仅(U + 0020)),在类名重复的情况下工作,并且通常覆盖边缘情况.


注意:截至今日(2016-12-13),XPath 3.1具有候选推荐状态.