4

在 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?为什么编码不能在冒号上工作?

4

5 回答 5

12

URI.escape(或encode)采用可选的第二个参数。这是一个匹配所有应该转义的符号的正则表达式。要转义所有非单词字符,您可以使用:

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    #=> ";/?:@&=+$,\\[\\]"
于 2013-08-21T18:55:10.467 回答
2
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>

为什么编码不能在冒号上工作?

因为编码/转义被破坏了。

于 2013-08-21T20:09:26.387 回答
0

问题似乎是冒号前面的空格,'lol :lol.txt'不工作,但'lol:lol.txt'工作。
也许您可以将空格替换为其他内容。

于 2013-08-21T18:49:56.433 回答
0

利用Addressable::URI::encode

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"
于 2013-08-21T18:50:26.190 回答
-1

如果要从给定字符串中转义特殊字符。最好使用

esc_uri=URI.escape("String with special character")

结果字符串是 URI 转义字符串,可以安全地将其传递给 URI。请参阅URI::Escape了解如何使用 URI 转义。希望这可以帮助。

于 2013-08-21T18:50:03.090 回答