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

Fla*_*kou 134 ruby uri ruby-on-rails url-parameters

我有一些网址,比如

http://www.example.com/something?param1=value1&param2=value2&param3=value3
Run Code Online (Sandbox Code Playgroud)

我想从这些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'}
Run Code Online (Sandbox Code Playgroud)

你有什么建议吗?

Sni*_*per 156

我想你想把任何给定的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')
Run Code Online (Sandbox Code Playgroud)

回报

{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
Run Code Online (Sandbox Code Playgroud)

  • 为清楚起见,@ Flackou想要这个:`CGI.parse(URI.parse(url).query)` (87认同)
  • 好吧,那是我错过的!与 URI.parse 一起使用时它是完美的: CGI.parse(URI.parse("http://www.example.com/something?param1=value1¶m2=value2¶m3=value3").query) 返回所需的哈希。谢谢你的帮助。 (2认同)
  • 我实际上必须使用它:`CGI :: parse(URI :: parse(url).query)` (2认同)

小智 148

我发现自己最近的项目需要同样的东西.在Levi的解决方案的基础上,这是一个更清洁,更快的方法:

Rack::Utils.parse_nested_query 'param1=value1&param2=value2&param3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
Run Code Online (Sandbox Code Playgroud)

  • 对于任何寻找反向的人来说,它是 `Rack::Utils.build_nested_query(params)`(如果用 `Rack::Utils.parse_query` 解析,则为 `Rack::Utils.build_query(params)`)。 (3认同)
  • 很好找.如果你有简单的参数(非嵌套)并且对性能敏感,那么Rack :: Utils.parse_query可能会引起人们的兴趣.代码值得一读:https://github.com/rack/rack/blob/master/lib/rack/utils.rb (2认同)

rtd*_*tdp 93

刚刚改进Levi回答 -

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

对于像上面的url这样的字符串,它将返回

{ "par" => "hello", "par2" => "bye" } 
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.简单,像op一样处理完整的URL,结果值是字符串而不是数组,就像在其他答案中一样.谢谢. (7认同)
  • 正如我上面评论的那样,对于任何寻找逆的人来说,它是`Rack :: Utils.build_query(params)`. (2认同)
  • 当心 - 并非完全相反,至少在 Ruby 1.8.7 / Rails 2.3 中不是。foo[]=1&foo[]=2 的查询字符串被正确解析为 { "foo" =>["1","2"] },但 build_query 将其转换为 "foo=1&foo=2",在解析时再次产生 {"foo"=>"2"}。 (2认同)

小智 42

对于URI.parse与之结合的纯Ruby解决方案CGI.parse(即使不需要Rails/Rack等,也可以使用它):

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


Aru*_*hit 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"}
Run Code Online (Sandbox Code Playgroud)

阅读方法docomentation ::decode_www_form.


Yar*_*rin 12

查看可寻址的 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'
Run Code Online (Sandbox Code Playgroud)

(与URI不同,它显然也处理param编码/解码)


小智 8

对于 Ruby 2.7/3,使用 CGI 可能是一种过时的方法。

这是使用 URI 执行此操作的巧妙方法:

uri = URI.parse 'https://duckduckgo.com/?q=ruby+programming+language'
params = Hash[URI.decode_www_form uri.query]
# => {"q"=>"ruby programming language"} 
Run Code Online (Sandbox Code Playgroud)

  • 看,不需要额外的库 (2认同)