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)
也不起作用!因为它错误地匹配与类元素foobar的,例如
<div class="foobar">
Run Code Online (Sandbox Code Playgroud)
感谢这位家伙,他是我在网上找到的最早发布的解决这个问题的解决方案:http: //dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes-在-xpathxslt /
XPath 3.1引入了一个函数contains-token,因此最终解决了这个"正式"问题.它旨在支持类.
例:
//*[contains-token(@class, "foo")]
此功能可确保正确处理空白区域(不仅(U + 0020)),在类名重复的情况下工作,并且通常覆盖边缘情况.
注意:截至今日(2016-12-13),XPath 3.1具有候选推荐状态.
| 归档时间: |
|
| 查看次数: |
63049 次 |
| 最近记录: |