Ruby 또는 Rails를 사용하여 URL에서 URL 매개 변수를 추출하는 방법은 무엇입니까?


137

같은 URL이 있습니다.

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

이 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'}

조언이 필요하십니까?


1
Hash[*string.split('&').collect{|i|i.split('=')}.flatten] 이것도 효과가 있지만 아마도이 경우에는 최악의 옵션 일 것입니다. 그러나 여전히이 스 니펫은 흥미로울 것입니다. (이것이 답으로 간주되지 않기 때문에 의견으로 게시 :-))
Vojto

답변:


162

주어진 URL 문자열을 해시로 바꾸고 싶습니까?

http://www.ruby-doc.org/stdlib/libdoc/cgi/rdoc/classes/CGI.html#M000075 를 시도해 볼 수 있습니다

require 'cgi'

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

보고

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

1
좋아, 그게 내가 놓친 것이었다! URI.parse와 함께 사용하면 완벽합니다. CGI.parse (URI.parse ( " example.com/… )는 원하는 해시를 반환합니다. 도움을 주셔서 감사합니다.
Flackou

91
명확성을 위해, @Flackou는 이것을 원합니다 : CGI.parse(URI.parse(url).query)
glenn jackman

나는 이것을 테스트하지 않았지만 전체 URL을 포함하여 나열된 첫 번째 키는 실제로 잘못 된 것 같습니다.
Levi

2
실제로 이것을 사용해야했습니다 : CGI::parse(URI::parse(url).query)
portforwardpodcast

151

최근 프로젝트에서 똑같은 것이 필요하다는 것을 알았습니다. Levi의 솔루션을 기반으로 다음은 더 깨끗하고 빠른 방법입니다.

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

랙 요청을 조롱하는 것보다 훨씬 가벼운
Gareth

2
잘 찾았어요 단순 매개 변수 (중첩되지 않음)가 있고 성능에 민감한 경우 Rack :: Utils.parse_query가 유용 할 수 있습니다. 코드는 읽을 가치가있다 : github.com/rack/rack/blob/master/lib/rack/utils.rb
Levi

감사합니다, 매우 유용합니다 :)
Blue Smith

이것은 잘 작동하지만 이름이 같은 확인란에는 작동하지 않습니다 param1=value1&param1=value2. 두 번째 값이 첫 번째 값보다 우선합니다.
B Seven

역을 찾는 사람은 Rack::Utils.build_nested_query(params)(또는로 Rack::Utils.build_query(params)구문 분석 된 경우 Rack::Utils.parse_query)입니다.
zelanix

99

위의 Levi 답변으로 개선되었습니다.

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

위의 URL과 같은 문자열의 경우 반환됩니다

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

7
좋은 대답입니다. 간단하고 op 요청과 같은 전체 URL을 처리하며 결과 값은 다른 답변과 같이 배열 대신 문자열입니다. 감사.
jackocnr

3
위에서 언급했듯이 역을 찾고있는 사람은 Rack::Utils.build_query(params)입니다.
zelanix

1
적어도 Ruby 1.8.7 / Rails 2.3에서는 그렇지 않습니다. foo [] = 1 & foo [] = 2의 쿼리 문자열은 { "foo"=> [ "1", "2"]}로 올바르게 구문 분석되지만 build_query는이를 구문 분석 할 때 "foo = 1 & foo = 2"로 바꿉니다. 다시 { "foo"=> "2"}를 생성합니다.
Raels

45

순수 루비 솔루션의 결합 URI.parse으로 CGI.parse(이 경우에도 레일 / 랙 등이 필요하지 않은 경우 사용할 수 있습니다)

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

33

여러 가지 방법으로 문제를 해결할 수 있습니다. 다른 사람들이 당신에게 몇 가지 트릭을 보여주었습니다. 또 다른 트릭을 알고 있습니다. 여기 내 시도가 있습니다 :-

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

의 방법 docomentation을 읽으십시오 ::decode_www_form.


13

쿼리 구문 분석을 용이하게하는 Ruby의 URI 모듈을 대체 할 수있는 주소 지정 가능 gem을 확인하십시오 .

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

(또한 URI와 달리 매개 변수 인코딩 / 디코딩도 처리합니다)


-3

Controller에서라는 사전 (해시)에 액세스 할 수 있어야합니다 params. 따라서 각 쿼리 매개 변수의 이름이 무엇인지 알고 있다면params[:param1] 의 이름이 무엇인지 알고 있으면 액세스하십시오 ... 매개 변수의 이름이 무엇인지 모르는 경우 사전을 탐색하고 키를 얻을 수 있습니다.

여기 몇 가지 간단한 예가 있습니다 .


좋아, 요청한 URL로 컨트롤러에서 잘 작동하지만 다른 임의의 URL에서는 어떻게 작동합니까?
Flackou
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.