我正试图从XPath中的正则表达式中找到一个等价的(.*)。现在这就是我目前拥有的:
我有一个HTML a标记,其中href为world/nl44/town/ANYNUMBER
,其中ANYNBUMBER
,所以它可以是:world/nl44/town/12345
和world/nl44/town/1232
被一个随机值取代(我只需要一个标记的值)。
查询看起来像这样:
$elements = $xpath->query('//a[@href="/world/nl44/town/ANYNUMBER"]');
当然ANYNUMBER
被(.*)的XPath等价物替换
综上所述:
<a href="/world/nl44/town/12344">Something</a>
<-这就是我的a的样子,12344可以是任何数字,我只需要标签之间的值,所以在这个例子中,我希望它返回"Something"。
我该怎么做?
您可以使用starts-with()
函数:
//a[starts-with(@href, "/world/nl44/town/")]
XPath 2.0
XPath 2.0具有使用模式匹配的字符串函数,其中.*
本身将起作用:
matches()
replace()
tokenize()
因此,在XPath2.0中,您可以使用:
//a[matches(@href, '/world/nl44/town/.*')]
XPath 1.0
XPath1.0不支持基于正则表达式的模式匹配,只支持基本的字符串函数。虽然.*
没有直接等价,但有时可以使用starts-with()
(在这种特殊情况下,请参阅@alexe的解决方案,+1)、contains()
或其他XPath 1.0字符串函数来忽略字符串的部分,以获得与匹配.*
类似的结果。作为另一个例子,可以通过substring()
、string-length()
和字符串相等性检查的巧妙组合来忽略字符串的开头,从而有效地实现类似ends-with()
的功能。