154 votes

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

J'ai quelques URL, comme

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

et j'aimerais extraire les paramètres de ces URLs et les récupérer dans un Hash. Évidemment, je pourrais utiliser des expressions régulières, mais je me demandais s'il y avait des moyens plus simples de le faire avec Ruby ou Rails. Je n'ai rien trouvé dans le module Ruby URI mais j'ai peut-être raté quelque chose.

En fait, j'ai besoin d'une méthode qui permette de faire cela :

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

Auriez-vous des conseils à nous donner ?

1 votes

Hash[*string.split('&').collect{|i|i.split('=')}.flatten] Cela fonctionnerait également, mais c'est probablement la pire option dans ce cas. Néanmoins, vous pourriez trouver cet extrait intéressant. (Je le poste en tant que commentaire car je ne le considère pas comme une réponse :-))

186voto

Sniper Points 1480

Je pense que vous voulez transformer n'importe quelle chaîne d'URL en un 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')

retours

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

2 votes

OK, c'est celui que j'avais raté ! C'est parfait quand on l'utilise avec URI.parse : CGI.parse(URI.parse(" exemple.com/.query) ) renvoie le Hash souhaité. Merci pour votre aide.

97 votes

Pour plus de clarté, @Flackou veut ceci : CGI.parse(URI.parse(url).query)

1 votes

Je ne l'ai pas testé, mais la première clé listée, contenant l'url complète, semble vraiment erronée.

175voto

Arthur Gunn Points 561

J'ai eu besoin de la même chose pour un projet récent. En m'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"}

0 votes

Beaucoup plus léger que de simuler une requête Rack

2 votes

Bonne trouvaille. Si vous avez des paramètres simples (non imbriqués) et que vous êtes sensible aux performances, Rack::Utils.parse_query peut être intéressant. Le code vaut la peine d'être lu : github.com/rack/rack/blob/master/lib/rack/utils.rb

0 votes

Merci, c'est très utile :)

110voto

rtdp Points 972

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 l'url ci-dessus, il renverra

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

7 votes

Excellente réponse. simple, elle traite l'URL complète comme le demande l'opérateur, et les valeurs des résultats sont des chaînes de caractères au lieu de tableaux, comme dans les autres réponses. merci.

4 votes

Comme je l'ai dit plus haut, pour ceux qui cherchent l'inverse, c'est Rack::Utils.build_query(params) .

2 votes

Attention, ce n'est pas tout à fait l'inverse, du moins pas dans Ruby 1.8.7 / Rails 2.3. Une chaîne de requête de foo[]=1&foo[]=2 est correctement analysée comme { "foo" =>["1", "2"] }, mais build_query la transforme en "foo=1&foo=2", ce qui, une fois analysé à nouveau, donne { "foo"=>"2"}.

53voto

alup Points 671

Pour une solution purement Ruby, combinez URI.parse con CGI.parse (ceci peut être utilisé même si les rails/racks, etc. ne sont pas nécessaires) :

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

0 votes

C'est élégant.

42voto

Arup Rakshit Points 50675

Il y a plus d'une façon de résoudre votre problème. D'autres vous ont montré quelques astuces. J'en connais une autre. 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 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X