簡體   English   中英

Ruby:如何使用方括號[和]來轉義url?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM