programing

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

goodsources 2023. 5. 31. 15:53
반응형

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

몇 개의 URL이 있습니다.

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

그리고 이 URL에서 매개 변수를 추출하여 해시로 가져오고 싶습니다.분명히 정규 표현을 사용할 수 있지만 루비나 레일즈로 더 쉽게 할 수 있는 방법이 있는지 궁금했을 뿐입니다.루비 모듈에서 아무것도 찾지 못했습니다.URI뭔가를 놓친 것 같아요

사실, 저는 그렇게 할 수 있는 방법이 필요합니다.

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

조언을 좀 해 주시겠습니까?

주어진 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"]}

저는 최근의 프로젝트에서 같은 것이 필요하다는 것을 알게 되었습니다.Levi의 솔루션을 기반으로 더욱 깨끗하고 빠른 방법을 소개합니다.

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

위의 레비 답변으로 방금 개선됨 -

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

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

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

순수한 Ruby 솔루션의 경우 조합URI.parse와 함께CGI.parse(레일/랙 등이 필요하지 않은 경우에도 사용할 수 있습니다.

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

문제를 해결하는 방법은 여러 가지가 있습니다.다른 사람들이 몇 가지 속임수를 보여주었습니다.또 다른 요령을 알아요.여기 제 시도가 있습니다 :-

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

의 방법 설명서를 읽어 보십시오.

쿼리 구문 분석을 쉽게 하는 Ruby의 URI 모듈을 대체하는 주소 지정 가능한 보석을 확인하십시오.

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

(URI와 달리 파라미터 인코딩/디코딩도 처리합니다.)

CGI를 사용하는 것은 Ruby 2.7/3에서 구식 접근 방식일 수 있습니다.

URI를 사용하여 이를 수행하는 좋은 방법은 다음과 같습니다.

uri = URI.parse 'https://duckduckgo.com/?q=ruby+programming+language'
params = Hash[URI.decode_www_form uri.query]
# => {"q"=>"ruby programming language"} 

이 방법을 사용할 수도 있습니다.


require 'uri'
require 'cgi'
uri = URI("https://example.com/?query=1&q=2&query=5")
a = CGI::parse(uri.query)
puts a                   #=> {"query"=>["1", "5"], "q"=>["2"]}
puts a["query"].to_s     #=> ["1", "5"]
puts a["query"][0]       #=>  1
puts a["query"][1]       #=>  5
puts a["q"][0]           #=>  2


그것은 안전하고 훨씬 쉽습니다.

슬프게도 둘 다URI그리고.addressablebuggy URL에서 쿼리 매개 변수를 추출할 때 라이브러리가 중단됩니다.예를 들어, 다음과 같은 두 가지 요소가 모두 깨집니다.

http://localhost:4300/webapp/foo/#//controller/action?account=001-001-111&email=john%40email.com

Arthur / Levi의 솔루션을 기반으로 구축, 사용url.split("?").try(:last)URL의 쿼리 매개변수 부분만 가져와서 사용할 수 있습니다.Rack::Utils.parse_nested_query해당 매개 변수 문자열을 해시로 구문 분석합니다.

또는 전체:

Rack::Utils.parse_nested_query(url.split("?").try(:last))

예를 들어 다음과 같습니다.

{"account": "001-001-111", "email": "john@email.com"}

컨트롤러에서 다음 사전(해시)에 액세스할 수 있어야 합니다.params각 쿼리 매개 변수의 이름이 무엇인지 알고 있다면 다음과 같이 하십시오.params[:param1]액세스할 수 있습니다.매개 변수의 이름이 무엇인지 모르는 경우 사전을 이동하여 키를 가져올 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/2500462/how-to-extract-url-parameters-from-a-url-with-ruby-or-rails

반응형