我正在遍历DOM的所有文本节点,并检查nodeValue是否包含某个字符串。
/html/body//text()[contains(.,'test')]
这是区分大小写的。但是,我还要抓住Test
,TEST
或TesT
。这是可能的XPath(在JavaScript中)吗?
答案 0 :(得分:91)
这适用于XPath 1.0。如果您的环境支持XPath 2.0,请参阅here。
是。可能,但不美观。
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
如果可以,请使用其他方式标记您感兴趣的文字部分,例如将其封闭在具有特定类别的<span>
中。
如果无法做到这一点,您可以让JavaScript帮助您构建适当的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 - 当然你只需翻译那些你实际上正在搜索的字符
答案 1 :(得分:53)
更漂亮:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
答案 2 :(得分:45)
使用lower-case():
/html/body//text()[contains(lower-case(.),'test')]
使用matches()正则表达式匹配不区分大小写 标志:
/html/body//text()[matches(.,'test', 'i')]
答案 3 :(得分:5)
是。您可以使用translate
将要匹配的文本转换为小写,如下所示:
/html/body//text()[contains(translate(.,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'),
'test')]
答案 4 :(得分:5)
如果您正在使用XPath 2.0,则可以将collation指定为contains()的第三个参数。但是,排序规则URI不是标准化的,因此详细信息取决于您使用的产品。
请注意,前面使用translate()给出的解决方案都假设您只使用26个字母的英文字母。
答案 5 :(得分:2)
我总是这样做的方法是在XPath中使用“translate”功能。我不会说它非常漂亮,但它可以正常工作。
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
希望这有帮助,