为什么不呢 URI.escape
逃避单引号?
URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"
为什么不呢 URI.escape
逃避单引号?
URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"
出于同样的原因,它不会逃脱 ?
要么 /
要么 :
等等。 URI.escape()
仅转义不能在URL中使用的字符 一点都不,而不是具有特殊含义的字符。
你在寻找什么 CGI.escape()
:
require "cgi"
CGI.escape("foo'bar\" baz")
=> "foo%27bar%22+baz"
这是一个老问题,但答案在很长一段时间内都没有更新。我以为我会为遇到同样问题的其他人更新这个。我发现的解决方案是 发布在这里: 使用 ERB::Util.url_encode
如果你有 erb
模块可用。这照顾了单引号& *
对我来说也是如此。
CGI::escape
没有正确地逃避空间(%20
)与加号相对。
根据文件, URI.escape(str [, unsafe])
使用匹配必须用代码替换的所有符号的正则表达式。默认情况下,该方法使用REGEXP :: UNSAFE。当此参数是String时,它表示字符集。
在你的情况下,要修改 URI.escape
为了逃避单引号你可以做这样的事......
reserved_characters = /[^a-zA-Z0-9\-\.\_\~]/
URI.escape(YOUR_STRING, reserved_characters)
说明:有关规范的一些信息......
使用[rfc3986]转义所有参数名称和值 百分比编码(%xx)机制。字符不在无保留 必须对字符集([rfc3986]第2.3节)进行编码。中的人物 不得对未保留的字符集进行编码。十六进制 编码中的字符必须为大写。文本名称和值必须 在[rfc3629]按百分比编码之前编码为utf-8个八位字节。
我知道这已经得到了回答,但我想要的是略有不同的东西,我想我也可以发布它:我想在网址中保留“/”,但是要逃避所有其他非标准字符。我这样做了:
#public filename is a *nix filepath,
#like `"/images/isn't/this a /horrible filepath/hello.png"`
public_filename.split("/").collect{|s| ERB::Util.url_encode(s)}.join("/")
=> "/images/isn%27t/this%20a%20/horrible%20filepath/hello.png"
当我为AWS Cloudfront编写缓存失效时,我需要逃避单引号,它不喜欢单引号并期望它们被转义。上面应该创建一个比标准URI.escape更安全的uri但仍然看起来像一个URI(CGI Escape通过转义“/”来打破uri格式)。