150

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

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

4

10 に答える 10

180

任意の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"]}
于 2010-03-23T14:20:11.783 に答える
169

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

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
于 2010-07-10T05:46:47.330 に答える
108

上記のLeviの答えでちょうど改善されました-

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

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

{ "par" => "hello", "par2" => "bye" } 
于 2012-02-22T15:56:05.047 に答える
50

純粋なRubyソリューションのURI.parse場合CGI.parse(Rails / Rackなどが不要な場合でも使用できます):

CGI.parse(URI.parse(url).query) 
# =>  {"name1" => ["value1"], "name2" => ["value1", "value2", ...] }
于 2012-06-07T10:25:01.437 に答える
41

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

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

于 2014-09-01T02:48:52.423 に答える
16

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

于 2015-01-02T15:59:06.217 に答える
2

この方法も使用できます


require 'uri'
require 'cgi'
uri = URI("https://example.com/?query=1&q=2&query=5")
a = CGI::parse(uri.query)
puts a                   #=> {"query"=>["1", "5"], "q"=>["2"]}
puts a["query"].to_s     #=> ["1", "5"]
puts a["query"][0]       #=>  1
puts a["query"][1]       #=>  5
puts a["q"][0]           #=>  2


その安全ではるかに簡単

于 2021-05-28T20:46:59.507 に答える
2

CGIの使用は、Ruby 2.7/3では時代遅れのアプローチかもしれません。

URIを使用してこれを行うための適切な方法は次のとおりです。

uri = URI.parse 'https://duckduckgo.com/?q=ruby+programming+language'
params = Hash[URI.decode_www_form uri.query]
# => {"q"=>"ruby programming language"} 
于 2021-10-22T17:45:55.093 に答える
1

残念ながら、バグのあるURLからクエリパラメータを抽出しようとすると、URIとライブラリの両方が壊れます。addressableたとえば、これは両方を壊します:

http://localhost:4300/webapp/foo/#//controller/action?account=001-001-111&email=john%40email.com

Arthur / Leviのソリューションに基づいて構築するurl.split("?").try(:last)と、URLのクエリパラメータ部分だけを取得し、それを使用Rack::Utils.parse_nested_queryしてパラメータの文字列をハッシュに解析できます。

または完全に:

Rack::Utils.parse_nested_query(url.split("?").try(:last))

私の例で戻る:

{"account": "001-001-111", "email": "john@email.com"}
于 2021-08-24T10:51:31.450 に答える
-4

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

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

于 2010-03-23T14:07:56.083 に答える