Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中从URL中删除参数最优雅的方式是什么?_Ruby_Url_Parsing - Fatal编程技术网

Ruby中从URL中删除参数最优雅的方式是什么?

Ruby中从URL中删除参数最优雅的方式是什么?,ruby,url,parsing,Ruby,Url,Parsing,我想在不知道是哪个参数的情况下,按URL的名称从URL中取出一个参数,然后重新组装URL 我想用CGI或URI自己写东西并不难,但我想这样的功能已经存在了。有什么建议吗 在: 输出: 可寻址gem将很好地实现这一点;请看铁皮人的高明回答。但是如果你想自己滚,下面是方法。这段代码唯一需要强调的是它在方法中隐藏了丑陋的东西: #!/usr/bin/ruby1.8 def reject_param(url, param_to_reject) # Regex from RFC3986 url_

我想在不知道是哪个参数的情况下,按URL的名称从URL中取出一个参数,然后重新组装URL

我想用CGI或URI自己写东西并不难,但我想这样的功能已经存在了。有什么建议吗

在:

输出:

可寻址gem将很好地实现这一点;请看铁皮人的高明回答。但是如果你想自己滚,下面是方法。这段代码唯一需要强调的是它在方法中隐藏了丑陋的东西:

#!/usr/bin/ruby1.8

def reject_param(url, param_to_reject)
  # Regex from RFC3986
  url_regex = %r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$"
  raise "Not a url: #{url}" unless url =~ url_regex
  scheme_plus_punctuation = $1
  authority_with_punctuation = $3
  path = $5
  query = $7
  fragment = $9
  query = query.split('&').reject do |param|
    param_name = param.split(/[=;]/).first
    param_name == param_to_reject
  end.join('&')
  [scheme_plus_punctuation, authority_with_punctuation, path, '?', query, fragment].join
end   

url = "http://example.com/path?param1=one&param2=2&param3=something3"
p url
p reject_param(url, 'param2')

# => "http://example.com/path?param1=one&param2=2&param3=something3"
# => "http://example.com/path?param1=one&param3=something3"

我想出了这样的主意

 def uri_remove_param(uri, params = nil)
   return uri unless params
   params = Array(params)
   uri_parsed = URI.parse(uri)
   return uri unless uri_parsed.query
   escaped = uri_parsed.query.grep(/&/).size > 0
   new_params = uri_parsed.query.gsub(/&/, '&').split('&').reject { |q| params.include?(q.split('=').first) }
   uri = uri.split('?').first
   amp = escaped ? '&' : '&'
   "#{uri}?#{new_params.join(amp)}"
 end

也许有点离题,但对于任何试图在rails应用程序环境中实现这一点的人,您只需执行以下操作:

url_for(params.except(:name_of_param_to_delete))
注意:在rails v2.3.9中测试。

我更喜欢使用:

require 'addressable/uri'

uri = Addressable::URI.parse('http://example.com/path?param1=one&param2=2&param3=something3')

params = uri.query_values #=> {"param1"=>"one", "param2"=>"2", "param3"=>"something3"}
params.delete('param1') #=> "one"
uri.query_values = params #=> {"param2"=>"2", "param3"=>"something3"}

uri.to_s #=> "http://example.com/path?param2=2&param3=something3"

如果您不想包含额外的宝石,如果您不想使用讨厌的正则表达式,以下是我喜欢的方法:

require 'cgi'
require 'uri'

url = "http://example.com/path?param1=one&param2=2&param3=something3"

uri = URI(url) #=> #<URI::HTTP:0x007fbe25141a78 URL:http://example.com/path?param1=one&param2=2&param3=something3>
params = Rack::Utils.parse_nested_query(uri.query || "") #=> {"param1"=>["one"], "param2"=>["2"], "param3"=>["something3"]}
params.delete('param1') #=> ["one"]
uri.query = URI.encode_www_form(params) #=> "param2=2&param3=something3"

uri.to_s #=> "http://example.com/path?param2=2&param3=something3"
以及:


一行就足够了:

url.sub(/\?param_to_remove=[^&]*/, '?').sub(/\&param_to_remove=[^&]*/, '').sub(/\?$/,'')

如果你的url是字符串,这里有一个干净的:

  def remove_param(url, param_name)
    uri = URI(url)
    params = []
    URI.decode_www_form(uri.query || '').each do |param|
      next if param[0] == param_name

      params << param
    end
    uri.query = URI.encode_www_form(params)
    uri.to_s
  end


给自己打勾;我更喜欢你的答案。URI.parse?另一个我一无所知的便利图书馆。哦,如果。。。线路?您可以将其替换为params=Array(params)。当然,我是在玩数组(params)一段时间后才学会这个把戏的。。。应谨慎使用数组({}),因为它还将哈希转换为Array.Upvote以使用RFC中的实际正则表达式。非常好的参考。分号也可以用来分隔查询参数,您的
拒绝参数
与此有效URL不兼容
http://example.com/path?param1=one;参数2=2;param3=something3
@mu太短了,谢谢。我已修改(但未测试)代码,以允许
以及
=
。工作起来很有魅力!可寻址的Github页面:这比我的解决方案好得多。如果params为空,则会在url末尾产生不必要的“?”。在Rails中,我只是简单地添加了“.presence”来将空散列转换为nil,从而阻止了额外的“?”。因此,“uri.query_values=params.presence”和
的相反部分,除了
切片
非常聪明!谢谢你,这正是我想要的!谢谢我会像这样修改CGI解析以处理缺少的参数
CGI.parse(uri.query | |“”)
否则解析将引发异常。
CGI.parse('a=b&a=c') #=> {"a"=>["b", "c"]}
Rack::Utils.parse_nested_query('a=b&a=c') #=> {"a"=>"c"}
URI.encode_www_form({ a: :b, c: { d: 2 }}) #=> "a=b&c=%7B%3Ad%3D%3E2%7D"
{ a: :b, c: { d: 2 }}.to_query #=> "a=b&c%5Bd%5D=2"
url.sub(/\?param_to_remove=[^&]*/, '?').sub(/\&param_to_remove=[^&]*/, '').sub(/\?$/,'')
  def remove_param(url, param_name)
    uri = URI(url)
    params = []
    URI.decode_www_form(uri.query || '').each do |param|
      next if param[0] == param_name

      params << param
    end
    uri.query = URI.encode_www_form(params)
    uri.to_s
  end
def remove_param(url, param_value)
next if param[1] == param_value