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

标签 ruby xpath css-selectors nokogiri case-insensitive

我正在使用 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/

相关文章:

ruby-on-rails - 找不到路径 "/sessions/user"的设计映射设计登录错误

javascript - 消失的复选标记之谜

php - 使用DOMDocument和DOMXPath类从网站中检索类别

html - 编号类/id 的 CSS 选择器

css - 是否有 CSS 父级选择器?

javascript - 如何组合多个类似ctags的标签工具?

ruby-on-rails - 根据列的值获取记录的第一个实例

xhtml - 什么 XPath 选择包含 X 的 <tr> 之后的下一个 <tr>?

xpath - Selenium :在searchContext中查找元素

css - 为嵌套的 CSS 选择器组合 (AND) 多个条件的正确方法是什么?