web-dev-qa-db-ja.com

RubyまたはRailsを使用してURLからURLパラメーターを抽出する方法は?

私はいくつかの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'}

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

132
Flackou

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

試すことができます 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"]}
150
Sniper

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

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

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

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

上記のような文字列の場合、

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

純粋なRubyソリューションの場合、URI.parseCGI.parseを組み合わせます(Rails/Rackなどが不要な場合でも使用できます)。

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

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

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"}

::decode_www_form のメソッドのドキュメントを読んでください。

31
Arup Rakshit

addressable 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とは異なり、パラメータのエンコード/デコードも処理するようです)

12
Yarin