我想用正则表达式将'hoge'替换为'foo'。但是用户的价值是动态的,所以我不能使用str.gsub('hoge', 'foo')
。
str = '?user=hoge&tab=fuga'
我该怎么办?
答案 0 :(得分:3)
请勿使用正则表达式执行此操作。
这是使用现有轮子操纵URI的方法:
require 'uri'
str = 'http://example.com?user=hoge&tab=fuga'
uri = URI.parse(str)
query = URI.decode_www_form(uri.query).to_h # => {"user"=>"hoge", "tab"=>"fuga"}
query['user'] = 'foo'
uri.query = URI.encode_www_form(query)
uri.to_s # => "http://example.com?user=foo&tab=fuga"
可替换地:
require 'addressable'
uri = Addressable::URI.parse('http://example.com?tab=fuga&user=hoge')
query = uri.query_values # => {"tab"=>"fuga", "user"=>"hoge"}
query['user'] = 'foo'
uri.query_values = query
uri.to_s # => "http://example.com?tab=fuga&user=foo"
请注意,在示例中,参数的顺序发生了变化,但代码处理的差异没有问题。
您要使用URI或Addressable的原因是因为参数和值在包含非法字符时必须正确编码。 URI和Addressable知道规则并将遵循它们,而天真的代码假设不打扰编码,导致URI损坏。
URI是Ruby标准库的一部分,而Addressable功能更全面。随便挑选。
答案 1 :(得分:2)
答案 2 :(得分:0)
在使用.gsub
替换它的任何值之前,您可能想要找出用户查询首先映射到的内容。
首先,使用the URI module将URL字符串解析为URI对象。然后,您可以使用CGI查询方法使用the CGI module从URI对象中获取查询参数的键值对。最后,您可以.gsub
关闭该哈希值中的值。