web-dev-qa-db-fra.com

Comment extraire des paramètres d'URL d'une URL avec Ruby ou Rails?

J'ai des URL, comme

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

et je voudrais extraire les paramètres de ces URL et les obtenir dans un hachage. Évidemment, je pouvais utiliser des expressions régulières, mais je me demandais simplement s'il existait des moyens plus simples de faire cela avec Ruby ou Rails. Je n'ai rien trouvé dans le Ruby module URI mais j'ai peut-être oublié quelque chose.

En fait, j'ai besoin d'une méthode qui ferait cela:

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

Aurais-tu des conseils?

132
Flackou

Je pense que vous voulez transformer une chaîne d'URL donnée en HASH?

Vous pouvez essayer http://www.Ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

require 'cgi'

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

résultats

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

J'ai eu besoin de la même chose pour un projet récent. En vous appuyant sur la solution de Levi, voici une méthode plus propre et plus rapide:

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

Juste amélioré avec la réponse de Levi ci-dessus -

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

Pour une chaîne comme ci-dessus, elle retournera

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

Pour une solution pure Ruby, combinez URI.parse avec CGI.parse (cela peut être utilisé même si Rails/Rack, etc. ne sont pas nécessaires):

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

Il existe plus d'une façon de résoudre votre problème. D'autres vous ont montré quelques astuces. Je connais un autre truc. Voici mon essai: -

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

Lire la documentation sur la méthode de ::decode_www_form .

31
Arup Rakshit

Découvrez le adressable gem - un remplacement populaire du module URI de Ruby qui facilite l'analyse de requête:

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

(Il gère apparemment aussi l'encodage/décodage param, contrairement à l'URI)

12
Yarin