2017-04-07 27 views
0

我想用正則表達式將'hoge'替換爲'foo'。但用戶的價值是動態的,所以我不能使用str.gsub('hoge', 'foo')如何使用捕獲的正則表達式替換URL中的字符串

str = '?user=hoge&tab=fuga' 

我該怎麼辦?

+0

你的問題是一個XY問題。你問的是Y,但需要詢問X,這將是「我如何使用參數來操作URL」。 –

+0

我第一次聽到'XY問題'。我學到了一些新東西。謝謝。 – faara

回答

0

在使用.gsub來替換它的任何值之前,您可能想要先查明用戶查詢映射的內容。

首先,使用the URI module將URL字符串解析爲URI對象。然後,您可以使用CGI查詢方法使用the CGI module從URI對象中獲取查詢參數的鍵值對。最後,您可以在該散列值中刪除.gsub

+0

爲什麼同時使用URI和CGI?如果使用URI和CGI,爲什麼要使用'gsub'? –

+0

@TheTinMan似乎OP想要改變原來的參數值。非常具體的問大聲笑 – Xenyal

2

你可以試試下面的正則表達式

([?&]user=)([^&]+) 

DEMO

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" 

注意,在例子中參數的順序改變,但代碼處理的差異不問題。

您想使用URIAddressable的原因是因爲參數和值在包含非法字符時必須正確編碼。 URI和Addressable知道規則並且會遵循它們,而天真的代碼假定不用擔心編碼,導致破壞的URI。

URI是Ruby標準庫的一部分,而且Addressable功能更加全面。拿你的選擇。