我正在DOM的所有textnode上运行,并检查nodeValue是否包含某个字符串。
/html/body//text()[contains(.,'test')]
这是区分大小写的。但是,我也想抓住Test
,TEST
或者TesT
。XPath(在JavaScript中)可以实现吗?
Answers:
这是针对XPath 1.0的。如果您的环境支持XPath 2.0,请参见此处。
是。可能,但是不漂亮。
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
这适用于事先知道字母的搜索字符串。添加您希望看到的所有带重音符号的字符。
如果可以的话,请通过其他方式标记您感兴趣的文本,例如<span>
在构建HTML时将其包含在具有特定类的文本中。与元素文本中的子字符串相比,使用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的答案的提示 -当然,您只需要翻译实际要搜索的字符即可。)
这种方法适用于任何搜索字符串,而无需先验字母知识,这是一个很大的优势。
当搜索字符串可以包含单引号时,上述两种方法都将失败,在这种情况下事情会变得更加复杂。
translate()
本身并不关心您重复每个字符的频率- translate(., 'EE', 'ee')
绝对等于translate(., 'E', 'e')
。PS:别忘了投票@KirillPolishchuk,这个主意是他的。
更美丽:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
TEST
为原样test
并保留Test
原样吗?
translate(., 'TES', 'tes')
。这样人们就会意识到这不是单词翻译,而是字母翻译。