如何编写一个CSS选择器,以不区分大小写的方式查找以文本开头的元素?

时间:2017-07-10 18:41:55

标签: ruby xpath css-selectors nokogiri case-insensitive

我正在使用Rails 5.0.1和Nokogiri。如何以不区分大小写的方式选择文本以某个字符串开头的CSS元素?现在我可以使用

以区分大小写的方式搜索某些内容
doc.css("#select_id option:starts-with('ABC')")

但我想知道在寻找以某些文字开头的选项时如何忽视这个案例?

1 个答案:

答案 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 )

...但所有这些都可以让您重新使用搜索代码。