我正在使用 Rails 5.0.1 和 Nokogiri。 如何选择文本以不区分大小写的方式以特定字符串开头的 CSS 元素? 现在,我可以通过以下方式以区分大小写的方式搜索某些内容
doc.css("#select_id option:starts-with('ABC')")
但是我想知道如何在寻找以某些文本开头的选项时忽略大小写?
总结这很丑陋。你最好只使用 Ruby:
doc.css('select#select_id > option').select{ |opt| opt.text =~ /^ABC/i }
详细信息
Nokogiri 使用 libxml2,它使用 XPath 搜索 XML 和 HTML 文档。Nokogiri 将 ~CSS 表达式转换为 XPath。例如,对于您的 ~CSS 选择器,这是 Nokogiri 实际搜索的内容:
Nokogiri::CSS.xpath_for("#select_id option:starts-with('ABC')")
#=> ["//*[@id = 'select_id']//option[starts-with(., 'ABC')]"]
你写的表达式实际上不是CSS。CSS 中没有:starts-with()
伪类,甚至在 Selectors 4 中也没有提出。XPath 中的starts-with()
函数,Nokogiri (有点令人惊讶(允许您将 XPath 函数混合到您的 CSS 中,并将它们带到它内部使用的 XPath 中。
libxml2 库仅限于 XPath 1.0,在 XPath 1.0 中,不区分大小写的搜索是通过将所有字符转换为小写来完成的。因此,您想要的 XPath 表达式是:
//select[@id='select_id']/option[starts-with(translate(.,'ABC','abc'),'abc')]
(假设你只关心那些角色!
我不确定你是否可以以Nokogiri会产生该表达式的方式编写CSS + XPath。您需要使用xpath
方法并向其提供该查询。
最后,您可以创建自己的自定义 CSS 伪类并在 Ruby 中实现它们。例如:
class MySearch
def insensitive_starts_with(nodes, str)
nodes.find_all{ |n| n.text =~ /^#{Regex.escape(str)}/i }
end
end
doc.css( "select#select_id > option:insensitive_starts_with('ABC')", MySearch )
。但所有这些都为您提供了搜索代码的可重用性。