2017-07-10 3 views
2

NokogiriでRails 5.0.1を使用しています。どのようにテキストが大文字小文字を区別しないで特定の文字列で始まるCSS要素を選択するのですか?今、私は大文字小文字を区別しない方法でテキストで始まる要素を探すCSSセレクタを作成するにはどうすればよいですか?

doc.css("#select_id option:starts-with('ABC')") 

を使用して、大文字と小文字を区別した方法で何かを検索することができますが、私は特定のテキストで始まるオプションを探していたときにケースを無視する方法を知りたいですか?

答えて

2

要約これは醜いです。あなただけの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) 

...しかし、これはすべて検索コードの再利用性を示します。

+0

そして私は疑似のjQueryの実装が奇妙だと思った... – BoltClock

関連する問題