我正在运行DOM的所有textnodes,并判断nodeValue是否包含某个字符串.
/html/body//text()[contains(.,'test')]
这是区分大小写的.不过,我也想搭Test
次、TEST
次或TesT
次.使用XPath(JavaScript)可以做到这一点吗?
我正在运行DOM的所有textnodes,并判断nodeValue是否包含某个字符串.
/html/body//text()[contains(.,'test')]
这是区分大小写的.不过,我也想搭Test
次、TEST
次或TesT
次.使用XPath(JavaScript)可以做到这一点吗?
这是针对XPath 1.0的.如果您的环境支持XPath 2.0,请参阅here.
对有可能,但不漂亮.
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
这将适用于预先知道字母表的搜索字符串.添加您希望看到的任何重音字符.
如果可以的话,可以用其他方法标记感兴趣的文本,比如在构建HTML时将其封装在一个<span>
中,这个<span>
中有一个特定的类.与元素文本中的子字符串相比,使用XPath查找这些内容要容易得多.
如果不能这样做,您可以让JavaScript(或用于执行XPath的任何其他主机语言)帮助您构建动态XPath表达式:
function xpathPrepare(xpath, searchString) {
return xpath.replace("$u", searchString.toUpperCase())
.replace("$l", searchString.toLowerCase())
.replace("$s", searchString.toLowerCase());
}
xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"
(帽子尖到@KirillPolishchuk's answer——当然,你只需要翻译那些你实际上是searching的字符.)
这种方法适用于任何搜索字符串,而不需要事先了解字母表,这是一个很大的优势.
当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下会得到more complicated.