不区分大小写的 XPath 包含() 可能吗?
2022-08-30 05:27:46
我正在运行DOM的所有文本节点,并检查nodeValue是否包含某个字符串。
/html/body//text()[contains(.,'test')]
这区分大小写。但是,我也想抓住,或者.这在XPath(在JavaScript中)是可能的吗?Test
TEST
TesT
我正在运行DOM的所有文本节点,并检查nodeValue是否包含某个字符串。
/html/body//text()[contains(.,'test')]
这区分大小写。但是,我也想抓住,或者.这在XPath(在JavaScript中)是可能的吗?Test
TEST
TesT
这是针对 XPath 1.0 的。如果您的环境支持 XPath 2.0,请参阅此处。
是的。可能,但不美观。
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
这适用于事先知道字母表的搜索字符串。添加您希望看到的任何重音字符。
如果可以的话,使用其他方法标记您感兴趣的文本,例如在构建 HTML 时将其括在具有特定类的中。使用 XPath 比使用元素文本中的子字符串更容易找到此类内容。<span>
如果这不是一个选项,您可以让 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的答案 - 当然,你只需要翻译那些你实际搜索的字符。
这种方法适用于任何搜索字符串,而不需要事先了解字母表,这是一个很大的优势。
当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下,事情会变得更加复杂。
不区分大小写contains
/html/body//text()[contains(translate(., 'EST', 'est'), 'test')]