我正在DOM的所有textnode上运行,并检查nodeValue是否包含某个字符串。
/html/body//text()[contains(.,'test')]
这是区分大小写的。不过,我也想赶上Test,TEST或TesT。XPath(在JavaScript中)可以实现吗?
Test
TEST
TesT
是。可能,但不漂亮。
/html/body//text()[ contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'test' ) ]
这适用于事先知道字母的搜索字符串。添加您希望看到的所有带重音符号的字符。
如果可以的话,请通过其他方式标记您感兴趣的文本,例如<span>在构建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')]"