12

このURL:

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角かっこをエスケープしないのはなぜですか?

4

4 に答える 4

21

[%5B、と]で脱出できます%5D

URLは次のようになります。

URL.gsub("[","%5B").gsub("]","%5D")

私はその解決策が好きではありませんが、それは機能しています。

于 2013-07-27T19:06:59.740 に答える
11

encode角かっこは特別ではないため、エスケープしません。URIのパス部分では特別な意味がないため、実際にエスケープする必要はありません。

「安全でない」文字以外の文字をエスケープする場合は、encodeメソッドに2番目の引数を渡します。その引数は、正規表現に一致するか、エンコードするすべての文字を含む文字列である必要があります(関数がすでに一致する文字を含む)。

于 2012-10-22T15:02:54.217 に答える
6

サードパーティのgemを使用することがオプションである場合は、アドレス可能を試してください。

require "addressable/uri"

url = Addressable::URI.parse("http://[::1]/path[]").normalize!.to_s
#=> "http://[::1]/path%5B%5D"

正規化することに注意してください!メソッドは、無効な文字をエスケープするだけでなく、ホスト名部分で大文字と小文字を区別したり、不要にエスケープされた文字などでエスケープを解除したりします。

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"
于 2016-10-04T09:23:31.340 に答える
3

新しいIP-v6構文によると、次のようなURLが存在する可能性があります。

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
于 2016-02-17T15:12:11.407 に答える