Javascript 不区分大小写的XPath包含()是否可能?
我正在运行DOM的所有textnodes,并检查nodeValue是否包含某个字符串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
/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票反对,并且没有任何反对意见,你可以非常有信心这个答案是正确的