RubyまたはRailsでURLからURLパラメーターを抽出する方法


137

私はいくつかのURLを持っています

http://www.example.com/something?param1=value1&param2=value2&param3=value3

そして、これらのURLからパラメーターを抽出し、ハッシュで取得したいと思います。もちろん、正規表現を使用することもできますが、RubyやRailsを使用して簡単に実行できる方法があるかどうかだけを考えていました。Rubyモジュールには何も見つかりませんでしたが、URI何かを見落としました。

実際、私はそれを行う方法が必要です:

extract_parameters_from_url("http://www.example.com/something?param1=value1&param2=value2&param3=value3")
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'}

アドバイスはありますか?


1
Hash[*string.split('&').collect{|i|i.split('=')}.flatten] これも機能しますが、このケースではおそらく最悪のオプションです。しかし、それでもこのスニペットは興味深いかもしれません。(私はこれを答えとは思わないのでコメントとして投稿
Vojto 2010

回答:


162

特定のURL文字列をハッシュに変換したいと思いますか?

あなたはhttp://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075を試すことができます

require 'cgi'

CGI::parse('param1=value1&param2=value2&param3=value3')

戻り値

{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}

1
OK、それは私が逃したものでした!URI.parseと一緒に使用すると完璧です:CGI.parse(URI.parse( " example.com/…)は、目的のハッシュを返します。ご協力ありがとうございます
Flackou

91
明確にするために、@Flackouこの望んでいる: CGI.parse(URI.parse(url).query)
グレン・ジャックマン

私はこれをテストしていませんが、完全なURLを含む、リストされている最初のキーは本当に間違っているようです。
Levi

2
私は実際にこれを使用しなければなりCGI::parse(URI::parse(url).query)
ませんでした

151

最近のプロジェクトでも同じことが必要だと思いました。Leviのソリューションに基づいて、よりクリーンで高速な方法を次に示します。

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}

ラックリクエストをモックするよりもはるかに軽量
Gareth

2
良い発見。単純なパラメーター(ネストされていない)があり、パフォーマンスに敏感な場合は、Rack :: Utils.parse_queryが役立ちます。コードは読む価値があります:github.com/rack/rack/blob/master/lib/rack/utils.rb
Levi

ありがとう、それはとても便利です:)
ブルースミス

これはうまく機能しますが、同じ名前のチェックボックスでは機能しませんparam1=value1&param1=value2。2番目の値が最初の値より優先されます。
B 7

逆を探している人にとっては、そうですRack::Utils.build_nested_query(params)(またはでRack::Utils.build_query(params)解析した場合Rack::Utils.parse_query)。
zelanix

99

上記のLeviの回答で改善されました-

Rack::Utils.parse_query URI("http://example.com?par=hello&par2=bye").query

上記のURLのような文字列の場合、それは返されます

{ "par" => "hello", "par2" => "bye" } 

7
素晴らしい答え。単純で、opが要求するように完全なURLを処理し、結果の値は他の回答のように配列ではなく文字列です。ありがとう。
jackocnr 2013年

3
上でコメントしたように、逆を探している人にとっては、それはRack::Utils.build_query(params)です。
zelanix

1
注意してください-少なくともRuby 1.8.7 / Rails 2.3では逆ではありません。foo [] = 1&foo [] = 2のクエリ文字列は{"foo" => ["1"、 "2"]}として正しく解析されますが、build_queryはそれを "foo = 1&foo = 2"に変換します。再び{"foo" => "2"}が生成されます。
Raels

44

純粋なRubyのソリューションのために組み合わせることURI.parseCGI.parse(これもレール/ラックなど必要ない場合に使用することができます):

CGI.parse(URI.parse(url).query) 
# =>  {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }

33

問題を解決する方法は複数あります。他の人はあなたにいくつかのトリックを示しました。別のトリックを知っています。これが私の試みです:-

require 'uri'
url = "http://www.example.com/something?param1=value1&param2=value2&param3=value3"
uri = URI(url)
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1&param2=value2&param3=value3>
URI::decode_www_form(uri.query).to_h # if you are in 2.1 or later version of Ruby
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Hash[URI::decode_www_form(uri.query)] # if you are below 2.1 version of Ruby
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}

のメソッドdocomentationを読んでください::decode_www_form


13

アドレス指定可能な gemを確認してください。これは、RubyのURIモジュールの人気のある置き換えであり、クエリの解析を容易にします。

require "addressable/uri"
uri = Addressable::URI.parse("http://www.example.com/something?param1=value1&param2=value2&param3=value3")
uri.query_values['param1']
=> 'value1'

(URIとは異なり、明らかにパラメーターのエンコード/デコードも処理します)


-3

コントローラでは、という辞書(ハッシュ)にアクセスできるはずparamsです。したがって、各クエリパラメータの名前がわかっている場合は、params[:param1]それにアクセスするだけです。パラメータの名前がわからない場合は、ディクショナリを走査してキーを取得できます。

ここにいくつかの簡単な例があります


OK、私はそれがリクエストされたURLを持つコントローラーでうまく機能することを知っていましたが、他の任意のURLに対してそれを行う方法は?
Flackou
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.