我通过脚本(不是我的)将一些JSON传递给服务器,该脚本将JSON作为字符串接受。
JSON的某些内容包含单引号,因此我希望确保在传递给脚本之前对任何单引号进行转义。
我尝试了以下内容:
> irb
> 1.9.3p194 :001 > x = "that's an awesome string"
> => "that's an awesome string"
> 1.9.3p194 :002 > x.sub("'", "\'")
> => "that's an awesome string"
> 1.9.3p194 :003 > x.sub("'", "\\'")
> => "thats an awesome strings an awesome string"
但似乎无法正确使用语法。
答案 0 :(得分:33)
sub("'", "\'")
无效的原因是因为"\'"
与"'"
相同。在双引号内,单引号的转义是可选的。
sub("'", "\\'")
不起作用的原因是因为"\\'"
扩展为反斜杠后跟单引号。在sub
或gsub
参数内,后跟一些字符的反斜杠具有与相应的全局变量相当的特殊含义。特别是在这种情况下,全局变量$'
保存最后一个匹配点之后的子字符串。您"\\'"
或sub
参数位置内的gsub
指的是类似的内容。为了避免这种特殊约定,你应该将替换字符串放在一个块而不是一个参数中,并且由于你不想只匹配一个,你应该使用gsub
而不是sub
:
gsub("'"){"\\'"}
答案 1 :(得分:3)
为什么不使用JSON gem?
require 'json'
some_object = {'a string' => "this isn't escaped because JSON handles it.", 'b' => 2}
puts some_object.to_json
=> {"a string":"this isn't escaped because JSON handles it.","b":2}
一个往返的例子:
require 'pp'
pp JSON[some_object.to_json]
=> {
"a string" => "this isn't escaped because JSON handles it.",
"b" => 2
}
以双引号为例:
some_object = {
'a string' => "this isn't escaped because JSON handles it.",
'another string' => 'double-quotes get "escaped"'
}
puts some_object.to_json
=> {
"a string" => "this isn't escaped because JSON handles it.",
"another string" => "double-quotes get \"escaped\""
}
答案 2 :(得分:2)
如果你试图逃避单引号(撇号),你可能也想逃避双引号。 (这适用于Javascript / JSON)
最简单的方法是使用escape_javascript
http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html" Escapes回车以及JavaScript细分的单引号和双引号。"
注意这仅适用于 Ruby on Rails ,而不适用于纯Ruby。但是,您可以使用以下内容为纯Ruby创建polyfill:
JS_ESCAPE_MAP = { '\\' => '\\\\', '</' => '<\/', "\r\n" => '\n', "\n" => '\n', "\r" => '\n', '"' => '\\"', "'" => "\\'" }
def escape_javascript(javascript)
if javascript
result = javascript.gsub(/(\|<\/|\r\n|\342\200\250|\342\200\251|[\n\r"'])/u) {|match| JS_ESCAPE_MAP[match] }
else
''
end
end
答案 3 :(得分:0)
尝试这种方式,使用反斜杠转义:
puts 'sean\'s'
输出应该是:
sean's