我正在运行我的 DOM 的所有文本节点并检查 nodeValue 是否包含某个字符串。

/html/body//text()[contains(.,'test')]

这是区分大小写的。 但是,我也想捕获TestTESTTesT XPath(在 JavaScript 中)可以实现吗?

===============>>#1 票数:118 已采纳

这适用于 XPath 1.0。 如果您的环境支持 XPath 2.0,请参见此处


是的。 可能,但并不美丽。

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

这适用于预先知道字母表的搜索字符串。 添加您希望看到的任何重音字符。


如果可以,请使用其他方式标记您感兴趣的文本,例如在构建 HTML 时将其包含在具有特定类的<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 的回答的提示- 当然,您只需要翻译您实际搜索的那些字符。)

这种方法适用于任何搜索字符串,无需事先了解字母表,这是一个很大的优势。

当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下事情会变得更加复杂

===============>>#2 票数:66

更美丽:

/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]

===============>>#3 票数:61

XPath 2.0 解决方案

  1. 使用 小写()

    /html/body//text()[contains(lower-case(.),'test')]

  2. 使用match()正则表达式匹配其不区分大小写的标志:

    /html/body//text()[matches(.,'test', 'i')]

===============>>#4 票数:8

是的。 您可以使用translate将您要匹配的文本转换为小写,如下所示:

/html/body//text()[contains(translate(., 
                                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                      'abcdefghijklmnopqrstuvwxyz'),
                   'test')]

===============>>#5 票数:6

如果您使用的是 XPath 2.0,那么您可以将排序规则指定为 contains() 的第三个参数。 但是,整理 URI 未标准化,因此详细信息取决于您使用的产品。

请注意,之前使用 translate() 给出的解决方案都假定您仅使用 26 个字母的英文字母表。

更新: XPath 3.1 定义了用于大小写匹配的标准排序规则 URI。

===============>>#6 票数:4

我总是这样做的方式是使用 XPath 中的“翻译”功能。 我不会说它非常漂亮,但它可以正常工作。

/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
                                        'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]

希望这可以帮助,

  ask by Aron Woost translate from so

未解决问题?本站智能推荐: