[英]Ruby: How to escape url with square brackets [ and ]?
這個網址:
http://gawker.com/5953728/if-alison-brie-and-gillian-jacobs-pin-up-special-doesnt-get-community-back-on-the-air-nothing-will-[nsfw]
應該:
http://gawker.com/5953728/if-alison-brie-and-gillian-jacobs-pin-up-special-doesnt-get-community-back-on-the-air-nothing-will-%5Bnsfw%5D
但是當我將第一個傳遞給URI.encode
,它不會逃避方括號。 我也嘗試了CGI.escape
,但也逃脫了所有'/'。
我應該使用什么來正確轉義URL? 為什么URI.encode
沒有轉義方括號?
您可以使用%5D
轉義[
使用%5B
和]
。
您的網址將是:
URL.gsub("[","%5B").gsub("]","%5D")
我不喜歡這個解決方案,但它正在發揮作用。
encode
不會轉義括號,因為它們並不特殊 - 它們在URI的路徑部分沒有特殊含義,因此它們實際上不需要轉義。
如果你想要轉義除“不安全”之外的字符,請將第二個arg傳遞給encode方法。 那個arg應該是一個正則表達式匹配,或者是一個包含你想要編碼的每個字符的字符串( 包括該函數否則已經匹配的字符!)。
如果使用第三方gem是一種選擇,請嘗試尋址 。
require "addressable/uri"
url = Addressable::URI.parse("http://[::1]/path[]").normalize!.to_s
#=> "http://[::1]/path%5B%5D"
注意規范化! 方法不僅會轉義無效字符,還會在主機名部分執行casefolding,對不必要的轉義字符進行轉義等等:
uri = Addressable::URI.parse("http://Example.ORG/path[]?query[]=%2F").normalize!
url = uri.to_s #=> "http://example.org/path%5B%5D?query%5B%5D=/"
因此,如果您只想標准化路徑部分,請執行以下操作:
uri = Addressable::URI.parse("http://Example.ORG/path[]?query[]=%2F")
uri.path = uri.normalized_path
url = uri.to_s #=> "http://Example.ORG/path%5B%5D?query[]=%2F"
根據新的IP-v6語法 ,可能會有這樣的網址:
http://[1080:0:0:0:8:800:200C:417A]/index.html
因此,我們應該只在url的主機部分之后轉義[]:
if url =~ %r{\[|\]}
protocol, host, path = url.split(%r{/+}, 3)
path = path.gsub('[', '%5B').gsub(']', '%5D') # Or URI.escape(path, /[^\-_.!~*'()a-zA-Z\d;\/?:@&%=+$,]/)
url = "#{protocol}//#{host}/#{path}"
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.