如何让我的 Nokogiri :contains 不区分大小写?

How do I make my Nokogiri :contains case insensitive?

我正在使用 Ruby 2.4 和 Nokogiri。我有这个用于在我的页面上查找带有特定文本的元素...

a_elt = doc.at('a:contains("MY TEXT")') 

如何使 :contains 不区分大小写?我不保证文字总是大写。

据我所知,使用 CSS 选择器规则这应该是不可能的。但是 XPath 2.0 可以通过使用 upper-case() 转换文本内容或使用带有第三个参数 'i' 而不是 contains()matches() 来检查不区分大小写的文本,这将与不区分大小写的正则表达式。 Nokogiri 在内部将 CSS 选择器转换为 XPath 查询,因此您的示例变为 //a[contains(., "MY TEXT")。然而,Nokogiri 的 XML 特征是基于 libxml2 (MRI Ruby) 或 javax.xml.xpath (JRuby) 的,它们不支持 Xpath 2.0.

如果支持,您只需将 CSS 选择器替换为此 XPath 查询:

//a[contains(upper-case(.), "MY TEXT")]

但是您可以直接在 ruby 中实现文本比较,如下所示:

a_elt = doc.xpath('//a').detect { |node| /MY TEXT/i === node.text }

它不是很优雅,但它完成了工作:

require 'nokogiri'

doc = Nokogiri::XML(File.read("test.html"))

a_elt = doc.at("//a[
                    contains(
                      translate(
                        text(),
                        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                        'abcdefghijklmnopqrstuvwxyz'),
                      'my text')
               ]")

p a_elt.text
#=> "My TeXt Is WeIrD"