我正在使用Rails 5.0.1和Nokogiri。如何以不区分大小写的方式选择文本以某个字符串开头的CSS元素?现在我可以使用
以区分大小写的方式搜索某些内容doc.css("#select_id option:starts-with('ABC')")
但我想知道在寻找以某些文字开头的选项时如何忽视这个案例?
答案 0 :(得分:2)
摘要这很难看。你最好只使用Ruby:
doc.css('select#select_id > option').select{ |opt| opt.text =~ /^ABC/i }
<强>详情
Nokogiri使用libxml2,它使用XPath来搜索XML和HTML文档。 Nokogiri将~CK表达式转换为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,甚至没有在选择器4中提出。在XPath中有starts-with()
函数,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 )
...但所有这些都可以让您重新使用搜索代码。