我正在运行DOM的所有textnodes,并判断nodeValue是否包含某个字符串.

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

这是区分大小写的.不过,我也想搭Test次、TEST次或TesT次.使用XPath(JavaScript)可以做到这一点吗?

推荐答案

这是针对XPath 1.0的.如果您的环境支持XPath 2.0,请参阅here.


对有可能,但不漂亮.

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

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


如果可以的话,可以用其他方法标记感兴趣的文本,比如在构建HTML时将其封装在一个<span>中,这个<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's answer——当然,你只需要翻译那些你实际上是searching的字符.)

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

当搜索字符串可以包含单引号时,上述两种方法都会失败,在这种情况下会得到more complicated.

Html相关问答推荐

传单自定义标记(divIcon)html/css不适用

NG8004:找不到名为""的管道.'' [插件Angular 编译器]

Xpath:提取标签之间的文本,但一旦出现嵌入标签就停止

用于删除页面页眉上的超链接的CSS

如何使用CSS在<;表格中<;SVG&>?

默认情况下使用Disbale Scroll,但在单击图标后将其激活

错误时交换表单,成功时使用HTMX重定向

多次使用组件时计数Angular 14中嵌套数组的指令

使用shinyjqui拖放到网格表中

如何使用 Flutter 构建 Chrome 扩展?

如何居中此按钮,即使它已经在计算机分辨率中居中

jQuery 索引返回不正确的结果

Tailwind 网格行高度可防止拉伸到最高行的所有相同高度

网页设计不适合移动设备

如何将两个平行 div 的页面内的表格居中?

屏幕缩小时背景图像裁剪高度

CSS:第一个类型的伪类没有按预期工作

如何使用 CSS 和 HTML 将文本放入图像中?

Bootstrap 5 英雄

使用 htmloutput 在shiny 的应用程序中呈现文本