要約これは醜いです。あなただけのRubyを使用して方がいいでしょう:
doc.css('select#select_id > option').select{ |opt| opt.text =~ /^ABC/i }
詳細
鋸山は、XMLやHTML文書を検索するXPathを使用のlibxml2を使用しています。 Nokogiriは〜CSS式をXPathに変換します。あなたが書いた式は、実際にCSSではありません
Nokogiri::CSS.xpath_for("#select_id option:starts-with('ABC')")
#=> ["//*[@id = 'select_id']//option[starts-with(., 'ABC')]"]
:たとえば、あなたの〜CSSセレクタのために、これは鋸山が実際に検索するものです。 XPathにはstarts-with()
関数があり、NokogiriはXPath関数をCSSに組み込み、内部的に使用するXPathに渡すことができます(これはやや驚くべきことですが、starts-with()
の機能がセレクタ4では提案されていません)。:starts-with()
pseudo-class in CSSはありません。
libxml2ライブラリはXPath 1.0に制限されており、XPath 1.0では大文字と小文字を区別しない検索はtranslating all characters to lowercaseで行われます。あなたがほしいとXPath式はこのようです:
//select[@id='select_id']/option[starts-with(translate(.,'ABC','abc'),'abc')]
(!あなたは文字のみを気と仮定)
私はあなたが鋸山が生じるであろうような方法で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)
...しかし、これはすべて検索コードの再利用性を示します。
そして私は疑似のjQueryの実装が奇妙だと思った... – BoltClock