如何使用Ruby或Rails从URL中提取URL参数?

时间:2010-03-23 14:00:13

标签: ruby-on-rails ruby uri url-parameters

我有一些网址,比如

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

我希望从这些网址中提取参数并将其放入哈希中。显然,我可以使用正则表达式,但我只是想知道是否有更简单的方法来使用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'}

你有什么建议吗?

8 个答案:

答案 0 :(得分:149)

我认为您想将任何给定的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"]}

答案 1 :(得分:144)

我发现自己最近的项目需要同样的东西。 基于Levi的解决方案,这是一种更清洁,更快速的方法:

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

答案 2 :(得分:91)

刚刚改进Levi回答 -

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

对于像上面的网址一样的字符串,它将返回

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

答案 3 :(得分:41)

对于纯{Ruby}解决方案,将URI.parseCGI.parse组合在一起(即使不需要Rails / Rack等,也可以使用它):

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

答案 4 :(得分:31)

解决问题的方法不止一种。其他人向你展示了一些技巧。我知道另一个技巧。这是我的尝试: -

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的方法docomentation。

答案 5 :(得分:12)

查看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不同,它显然也处理param编码/解码)

答案 6 :(得分:0)

你也可以用这个方法


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


它更安全,更容易

答案 7 :(得分:-3)

在您的Controller中,您应该能够访问名为params的字典(哈希)。所以,如果你知道每个查询参数的名称是什么,那么只需要params[:param1]来访问它...如果你不知道参数的名称是什么,你可以遍历字典并获得密钥。

一些简单的例子here