如何编写 CSS 选择器以不区分大小写的方式查找以文本开头的元素?
How do I write a CSS selector that looks for an element starting with text in a case-insensitive way?
我在 Nokogiri 中使用 Rails 5.0.1。我如何 select 一个 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。 XPath 中没有 :starts-with()
pseudo-class in CSS, not even proposed in Selectors 4. What there is is the 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 )
...但是所有这一切都为您提供了搜索代码的可重用性。
我在 Nokogiri 中使用 Rails 5.0.1。我如何 select 一个 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。 XPath 中没有 :starts-with()
pseudo-class in CSS, not even proposed in Selectors 4. What there is is the 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 )
...但是所有这一切都为您提供了搜索代码的可重用性。