何が起こったのかを理解するだけで、正規表現はまったく必要ありません。問題は、 のコンテンツがsrc
HTML エンティティ用にエンコードされており、その結果、&
の変数間に埋め込まれてエンコードされていること&
です。
修正は、最初に文字列をデコードしてエンコーディングを逆にし、次に文字列をそのコンポーネントに分割することです。次を使用してそれを行うことができます。
require 'cgi'
require 'uri'
uri = URI.parse(src)
hash = Hash[URI::decode_www_form(CGI::unescapeHTML(uri.query))]
hash['src'] # => "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"
クエリをハッシュにデコードする別の方法は次のとおりです。
hash = Hash[CGI::unescapeHTML(uri.query).split('&').map{ |q| q.split('=') }]
で分割すると、配列の配列が得られ&
、それ=
を簡単にハッシュに変換して戻すことができるため、文字列内の任意の変数に簡単にアクセスできます。
これらは長いパスのように見えますが、問題を修正し、値を元の形式に戻します。
通常はそれをハッシュとして使用したいのですが、この場合"src"
、クエリに 2 つのパラメーターがあり、2 番目のパラメーターが最初のパラメーターを踏みにじる原因となるため、すべてを行うことはできません。2 番目ではなく 1 番目が必要な場合は、ハッシュに変換せずに取得する必要があります。
URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }
=> [["src", "*59flluvbaj110hp6ht5hrveof8@group.calendar.google.com*"], ["src", "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"]]
URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }[0]
=> ["src", "*59flluvbaj110hp6ht5hrveof8@group.calendar.google.com*"]
URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }[1]
=> ["src", "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"]
表示される文字列は正しくありませんが、代わりに、HTML から切り取って貼り付けたもののように見えます。その場合、正規表現ではなく、パーサーを使用してコンテンツを抽出する必要があります。そして、その場合、これを正しく行う方法は次のとおりです。
require 'nokogiri'
html = '<img src="http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src=59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com&color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odg%40group.calendar.google.com&color=%232952A3&ctz=America%2FNew_York" style=" border-width:0 " width="800" height="600" frameborder="0" scrolling="no">'
doc = Nokogiri.HTML(html)
src = doc.at('img')['src']
=> "http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src=59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com&color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odg%40group.calendar.google.com&color=%232952A3&ctz=America%2FNew_York"
ドキュメント内のタグの場所によってノコギリのat
方法 doc.at('img')
が変わるかもしれませんが<img>
、それをどう扱うかは別問題です。