我正在使用 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。没有 :starts-with()
pseudo-class in CSS ,甚至没有在 Selectors 4 中提出。有的是 starts-with()
XPath 中的函数,Nokogiri(有点令人惊讶)允许您将 XPath 函数混合到 CSS 中,并将它们传递到它内部使用的 XPath。
libxml2 库仅限于 XPath 1.0,在 XPath 1.0 中,不区分大小写的搜索由 translating all characters to lowercase 完成。 。您想要的 XPath 表达式如下:
//select[@id='select_id']/option[starts-with(translate(.,'ABC','abc'),'abc')]
(假设您只关心这些角色!)
我不确定您是否可以以 Nokogiri 生成该表达式的方式编写 CSS+XPath。您需要使用 xpath
方法并向其提供该查询。
最后,您可以创建自己的 custom CSS pseudo-classes并用 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 )
...但这一切为您提供了搜索代码的可重用性。
关于ruby - 如何编写一个 CSS 选择器,以不区分大小写的方式查找以文本开头的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019488/