Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不区分大小写的XPath包含()是否可能?_Javascript_Html_Xml_Xslt_Xpath - Fatal编程技术网

Javascript 不区分大小写的XPath包含()是否可能?

Javascript 不区分大小写的XPath包含()是否可能?,javascript,html,xml,xslt,xpath,Javascript,Html,Xml,Xslt,Xpath,我正在运行DOM的所有textnodes,并检查nodeValue是否包含某个字符串 /html/body//text()[contains(.,'test')] 这是区分大小写的。但是,我还想捕获Test、Test或Test。这在XPath(JavaScript)中可能吗?这是针对XPath 1.0的。如果您的环境支持XPath 2.0,请参阅 对。可能,但不漂亮 /html/body//text()[ contains( translate(., 'ABCDEFGHIJKLM

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

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

这是区分大小写的。但是,我还想捕获
Test
Test
Test
。这在XPath(JavaScript)中可能吗?

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


对。可能,但不漂亮

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]
这将适用于事先知道字母表的搜索字符串。添加您希望看到的任何重音字符


如果可以,可以用其他方法标记感兴趣的文本,比如在构建HTML时将其包含在具有特定类的
中。与元素文本中的子字符串相比,使用XPath查找这些内容要容易得多

如果这不是一个选项,您可以让JavaScript(或用于执行XPath的任何其他主机语言)帮助您构建动态XPath表达式:

函数xpathPrepare(xpath,searchString){ 返回xpath.replace(“$u”,searchString.toUpperCase()) .replace(“$l”,searchString.toLowerCase()) .replace(“$s”,searchString.toLowerCase()); } xp=xpathpready(“//text()[包含(翻译(,'u','l'),'s')],'Test”); //->“//text()[包含(翻译(,'TEST','TEST'),'TEST'))] (帽子提示-当然,您只需要翻译您实际搜索的字符。)

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


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

我一直这样做的方式是使用XPath中的“translate”函数。我不会说它很漂亮,但它工作正常

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

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

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

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

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

请注意,前面使用translate()给出的解决方案都假设您只使用26个字母的英语字母表

更新:XPath 3.1为大小写盲匹配定义了标准排序URI。

XPath 2.0解决方案
  • 使用:

    /html/body//text()[包含(小写(.),'test')]

  • 使用正则表达式匹配,不区分大小写 旗帜:

    /html/body//text()[匹配(,'test',i')]


  • +1绝对是。这是我没有想到的。(我将在回答中使用它,这比我编写的原始JavaScript例程好得多)它不只是将
    TEST
    转换为
    TEST
    并保持
    TEST
    不变吗?@MuhammadAdeelZahid-不,它将“t”替换为“t”,将“E”替换为“E”,等等。这是一个1对1的匹配。翻译
    可能更清楚(,'TES','TES'))
    。这样人们就会意识到这不是一个单词的翻译,而是一个字母的翻译。或者“EST”,EST,虽然它看起来很酷(虽然有点神秘),但搜索词的一部分出现在映射中(删除了重复的字母),谢谢!另外,添加很好,只翻译所需的字符。我很想知道什么是表演的胜利。请注意,xpathPrepare()可以以不同的方式处理多次出现的字符(例如,您获得了Teeeest和Teeeest)。@AronWoost:嗯,可能会有一些好处,如果您急于了解,只需对其进行基准测试即可
    translate()
    本身并不关心您重复每个字符的频率-
    translate(,'EE','EE')
    绝对等同于
    translate(,'E','E')
    。附言:别忘了投票@KirillPolishchuk,这个想法是他的.System.Xml.XmlNodeList x=mydoc.SelectNodes(“/*”[包含(翻译(text(),'abcdefghijklmnopqrstuvxyz'196ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ!Ö!Ö214;否。请参阅“当然,您只需要翻译您实际搜索的字符”部分。Firefox和Chrome不支持这种语法吗?我刚刚在控制台中尝试过,它们都返回了语法错误。Firefox和Chrome只实现了XPath 1.0。我在哪里可以验证它是否能按预期工作?@AnkitGupta:当然,任何支持XPath 2.0的在线或离线工具都可以用来验证这个答案,但是(1)工具建议在这里与(2)无关考虑到在六年多的时间里,56票赞成,0票反对,并且没有任何反对意见,你可以非常有信心这个答案是正确的