Ruby veya Rails içeren bir URL'den URL parametrelerini nasıl ayıklayabilirim?


137

Bazı URL'lerim var,

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

ve bu URL'lerden parametreleri ayıklamak ve bunları bir Hash içine almak istiyorum. Açıkçası, düzenli ifadeler kullanabilirdim, ama sadece Ruby veya Rails ile bunu yapmanın daha kolay yolları olup olmadığını merak ediyordum. Ruby modülünde hiçbir şey bulamadım URIama belki de bir şey kaçırdım.

Aslında, bunu yapacak bir yönteme ihtiyacım var:

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

Tavsiyeleriniz olur mu?


1
Hash[*string.split('&').collect{|i|i.split('=')}.flatten] Bu da işe yarayacaktı, ancak muhtemelen bu durum için en kötü seçenek. Ama yine de bu snippet'i ilginç bulabilirsiniz. (Bu bir cevap düşünmüyorum çünkü yorum olarak gönderme))
Vojto

Yanıtlar:


162

Herhangi bir URL dizesini HASH'e dönüştürmek istediğinizi düşünüyorum?

Deneyebilirsin http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075

require 'cgi'

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

İadeler

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

1
Tamam, özlediğim buydu! URI.parse ile birlikte kullanıldığında mükemmeldir: CGI.parse (URI.parse (" example.com/… ) istenen Hash'i döndürür. Yardımınız için teşekkürler.
Flackou

91
Anlaşılır olması için, @Flackou bunu istiyor: CGI.parse(URI.parse(url).query)
glenn jackman

Bunu test etmedim, ancak tam URL'yi içeren listelenen ilk anahtar gerçekten yanlış görünüyor.
Levi

2
Aslında bunu kullanmak zorunda kaldım: CGI::parse(URI::parse(url).query)
portforwardpodcast

151

Kendimi yeni bir proje için aynı şeye ihtiyaç duyduğumu gördüm. Levi'nin çözümüne dayanarak, daha temiz ve daha hızlı bir yöntem:

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

Bir Raf isteğiyle alay etmekten çok daha hafif
Gareth

2
İyi bulmak. Basit parametrelere (iç içe geçmiş) sahipseniz ve performansa duyarlıysanız, Rack :: Utils.parse_query ilginizi çekebilir. Kod okumaya değer: github.com/rack/rack/blob/master/lib/rack/utils.rb
Levi

Teşekkür ederim, çok faydalı :)
Blue Smith

Bu iyi çalışıyor ama aynı ada sahip işaret kutusu çalışmaz: param1=value1&param1=value2. İkinci değer birinciyi koyar.
B Seven

Tersini arayan herkes için, Rack::Utils.build_nested_query(params)(veya Rack::Utils.build_query(params)ile ayrıştırılırsa Rack::Utils.parse_query).
zelanix

99

Levi'nin yukarıdaki cevabı ile geliştirildi -

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

Yukarıdaki url gibi bir dize için,

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

7
mükemmel cevap. basit, tam URL'yi op gibi işler ve sonuç değerleri diğer yanıtlarda olduğu gibi diziler yerine dizelerdir. Teşekkürler.
jackocnr

3
Yukarıda yorumladığım gibi, tersi arayan herkes için Rack::Utils.build_query(params).
zelanix

1
Dikkat - tam tersi değil, en azından Ruby 1.8.7 / Rails 2.3'te değil. Foo [] = 1 & foo [] = 2 sorgu dizesi doğru şekilde {"foo" => ["1", "2"]} olarak ayrıştırılır, ancak build_query bunu "foo = 1 & foo = 2" biçimine dönüştürür. yine {"foo" => "2"} verir.
16'da Raels

45

Saf Ruby çözüm için birleştirmek URI.parseile CGI.parse(bu hatta Raylar / Raf vb gerekli değilse kullanılabilir):

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

33

Sorununuzu çözmek için birden fazla yol var. Diğerleri size bazı hileler gösterdi. Başka bir numara biliyorum. İşte benim deneyin: -

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

Yöntemini okuyun ::decode_www_form.


13

Adreslenebilir mücevherlere göz atın - Ruby'nin URI modülünün sorgu ayrışmasını kolaylaştıran popüler bir yedeği:

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

(Ayrıca görünüşe göre URI'den farklı olarak param kodlama / kod çözme işlemlerini gerçekleştirir)


-3

Denetleyicinizde, adlı bir sözlüğe (karma) erişebilmeniz gerekir params. Yani, her sorgu parametresinin adlarının ne olduğunu biliyorsanız,params[:param1] ona erişmek için yapın ... Parametrelerin adlarının ne olduğunu bilmiyorsanız, sözlüğü çevirebilir ve anahtarları alabilirsiniz.

Burada bazı basit örnekler .


Tamam, biliyordum, istenen URL ile denetleyicide iyi çalışıyor, ancak bunu diğer keyfi URL'ler için nasıl yapabilirim?
Flackou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.