在rails应用程序上,我需要解析uris
a = 'some file name.txt'
URI(URI.encode(a)) # works
b = 'some filename with :colon in it.txt'
URI(URI.encode(b)) # fails URI::InvalidURIError: bad URI(is not URI?):
如何安全地将文件名传递给包含特殊字符的URI?为什么不对冒号进行编码?
答案 0 :(得分:11)
URI.escape
(或encode
)采用可选的第二个参数。它是一个Regexp,匹配所有应该转义的符号。要转义所有非单词字符,您可以使用:
URI.encode('some filename with :colon in it.txt', /\W/)
#=> "some%20filename%20with%20%3Acolon%20in%20it%2Etxt"
encode
有两个预定义的正则表达式:
URI::PATTERN::UNRESERVED #=> "\\-_.!~*'()a-zA-Z\\d"
URI::PATTERN::RESERVED #=> ";/?:@&=+$,\\[\\]"
答案 1 :(得分:1)
require 'uri'
url = "file1:abc.txt"
p URI.encode_www_form_component url
--output:--
"file1%3Aabc.txt"
p URI(URI.encode_www_form_component url)
--output:--
#<URI::Generic:0x000001008abf28 URL:file1%3Aabc.txt>
p URI(URI.encode url, ":")
--output:--
#<URI::Generic:0x000001008abcd0 URL:file1%3Aabc.txt>
为什么不对冒号进行编码?
因为编码/转义被破坏了。
答案 2 :(得分:0)
问题似乎是冒号前面的空格,'lol :lol.txt'
不起作用,但'lol:lol.txt'
有效。
也许你可以替换其他东西。
答案 3 :(得分:0)
require "addressable/uri"
a = 'some file name.txt'
Addressable::URI.encode(Addressable::URI.encode(a))
# => "some%2520file%2520name.txt"
b = 'some filename with :colon in it.txt'
Addressable::URI.encode(Addressable::URI.encode(b))
# => "some%2520filename%2520with%2520:colon%2520in%2520it.txt"
答案 4 :(得分:-1)
如果要从给定字符串中转义特殊字符。最好使用
esc_uri=URI.escape("String with special character")
结果字符串是URI转义字符串,可以安全地将其传递给URI。 有关如何使用URI转义,请参阅URI::Escape。希望这会有所帮助。