我只想自行选择一个名为.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."";
}
那一段html呢? (更喜欢向我们展示asXML()的simpleXml输出,因为它更接近xpath)
如果有多个类,则需要执行contains(@class, date)
PHP的可能重复项-解析" href"标签中包含特定单词的所有链接
XPath的可能重复项:如何匹配包含某个字符串的属性
@Gordons答案很危险,如果class属性为" datetime",它也会匹配。 user716736的答案更加完整。
@NielsBom危险是一个很奇怪的词语选择。另外,我的回答清楚地表明它将找到包含(请注意重点)搜索词的所有链接。而且,这个问题是许多人的欺骗并没有改变。
杜佩:当然。危险:我改写为:您可能会得到比预期更多的收益。抱歉,但我认为您的评论("如果有...日期")不明确。
相关:stackoverflow.com/questions/1604471/和stackoverflow.com/questions/1390568/
如何使用XPath通过CSS类查找元素的可能重复项?
我想写这个问题的规范答案,因为上面的答案有问题。
我们的问题
CSS选择器:
.foo
将选择具有foo类的任何元素。
您如何在XPath中做到这一点?
尽管XPath比CSS强大,但是XPath没有CSS类选择器的本机等效项。但是,有一个解决方案。
正确的做法
XPath中的等效选择器是:
//*[contains(concat("", normalize-space(@class),"")," foo")]
该函数对空格进行归一化处理,以去除开头和结尾的空白(并且还将空格字符序列替换为单个空格)。
(从更一般的意义上讲)这也等同于CSS选择器:
*[class~="foo"]
它将匹配其类属性值是由空格分隔的值的列表的任何元素,其中一个值与foo完全相等。
几种明显但错误的方法
XPath选择器:
//*[@class="foo"]
不起作用!因为它不会匹配具有多个类的元素,例如
如果在类名周围有多余的空格,它也将不匹配:
"改进的" XPath选择器
//*[contains(@class,"foo")]
也不起作用!因为它错误地将元素与foobar类匹配,例如
值得称赞的是我在网上发现的最早解决此问题的解决方案:
标准化空间有什么需要?
"以上答案"可能是指MrGlasss。
这可能是吗? 我的意思是,类名用制表符分隔。
我认为*[class~="foo"]错过了@。 应该是*[@class~="foo"]。
但是和$ x(// div [contains(concat("",normalize-space(@class),"")," condition")])相同
@NielsBom-如何解决最后提到的包含限制? 改用CSS选择器? 另一个答案中给出的xpath包含令牌在最新的chrome中不起作用。
@ testerjoe2您尝试了*[contains(concat("", normalize-space(@class),"")," foo")]吗?
//[@class="date"]不是有效的xpath。
尝试//*[@class="date"],或者如果您知道它是图像,请尝试//img[@class="date"]
XPath 3.1引入了一个功能contains-token,因此最终解决了这个"正式"问题。它旨在支持类。
例:
//*[contains-token(@class,"foo")]
此函数可确保正确处理空白(不仅(U + 0020)),而且在类名重复的情况下也能正常工作,并且通常覆盖边缘情况。
注意:从今天开始(2016-12-13),XPath 3.1的状态为候选推荐。
它不适用于当今最新的Chrome。 在起作用之前,我们如何解决// * [contains(@class," foo")]也将选择任何包含foo的类的限制,例如foobar,fooz等。
在XPath 2.0中,您可以:
//*[count(index-of(tokenize(@class, '\s+' ), 'foo')) = 1]
正如克里斯蒂安·韦斯克(Christian Weiske)所说:
https://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm
不幸的是,截至2017年6月12日,chrome似乎尚未实现此功能。 基于en.wikipedia.org/wiki/,似乎全都缺乏
注意模板中的减号!!!如果要在DOM中查询" my-ownclass":
...
...
...
$finder = new DomXPath($dom);
$nodes = $finder->query(".//ul[contains(@class, 'my-ownclass')]"); // This will NOT behave as expected! This will strangely match all the
elements in DOM.
$nodes = $finder->query(".//ul[contains(@class, 'ownclass')]"); // This will match the element.
HTML允许不区分大小写的元素和属性名称,然后class是用空格分隔的类名称列表。在这里,我们使用一个img标记和一个名为date的class:
//*['IMG' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')]/@*['CLASS' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') and contains(concat(' ', normalize-space(.), ' '), concat(' ', 'date', ' '))]
另请参阅:CSS选择器到XPath的转换