J'ai des URL, comme
http://www.example.com/something?param1=value1¶m2=value2¶m3=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¶m2=value2¶m3=value3")
#=> {:param1 => 'value1', :param2 => 'value2', :param3 => 'value3'}
Aurais-tu des conseils?
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¶m2=value2¶m3=value3')
résultats
{"param1"=>["value1"], "param2"=>["value2"], "param3"=>["value3"]}
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¶m2=value2¶m3=value3'
# => {"param1"=>"value1", "param2"=>"value2", "param3"=>"value3"}
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" }
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", ...] }
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¶m2=value2¶m3=value3"
uri = URI(url)
# => #<URI::HTTP:0x89e4898 URL:http://www.example.com/something?param1=value1¶m2=value2¶m3=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
.
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¶m2=value2¶m3=value3")
uri.query_values['param1']
=> 'value1'
(Il gère apparemment aussi l'encodage/décodage param, contrairement à l'URI)