Ruby(Rails)unescape一个字符串 - 撤消Array.to_s

Joh*_*gan 4 ruby string ruby-on-rails http http-headers

一直在乱砍几个库,并遇到一个字符串被"双重逃脱"的问题.

例如: 固定示例

 > x = ['a']
 => ["a"] 
 > x.to_s
 => "[\"a\"]" 
 > 
Run Code Online (Sandbox Code Playgroud)

然后再来

\"\[\\\"s\\\"\]\"
Run Code Online (Sandbox Code Playgroud)

在处理http标头时发生了这种情况.我有一个标题,它将是一个数组,但http库正在对array.to_s值进行自己的字符转义.

我发现的解决方法是将数组转换为字符串,然后"撤消"to_s.像这样:formatted_value = value.to_s

if value.instance_of?(Array)
  formatted_value = formatted_value.gsub(/\\/,"") #remove backslash                                                 
  formatted_value = formatted_value.gsub(/"/,"")  #remove single quote
  formatted_value = formatted_value.gsub(/\[/,"") #remove [                                                                                                     
  formatted_value = formatted_value.gsub(/\]/,"") #remove ]   
end
value = formatted_value
Run Code Online (Sandbox Code Playgroud)

......有一个更好的方法......(不需要修补我正在使用的宝石).(是的,如果我的字符串实际上包含那些字符串,那么这个休息.)

建议?

**更新2**

好的.在这个街区仍然有麻烦,但现在我想我已经找到了核心问题.在to_s调用之后,它将我的数组序列化为json.至少,这似乎正在复制我所看到的.

[ 'A'].to_s.to_json

我正在调用一个返回to_s结果的gem中的方法,然后我在它上面调用to_json.

nzi*_*nab 8

由于您编辑过的问题,我已经编辑了我的答案:

我仍然无法复制你的结果!

>> x = ['a']
=> ["a"]
>> x.to_s
=> "a"
Run Code Online (Sandbox Code Playgroud)

但是当我改变最后一次调用时:

>> x.inspect
=> "[\"a\"]"
Run Code Online (Sandbox Code Playgroud)

所以我会假设你正在做的事情是什么?

这不一定是逃避价值 - 本身.它存储的字符串如下:

%{["a"]}
Run Code Online (Sandbox Code Playgroud)

更确切地说:

'["a"]'
Run Code Online (Sandbox Code Playgroud)

在任何情况下.这应该可以解除它的串行化:

>> x = ['a']
=> ["a"]
>> y = x.inspect
=> "[\"a\"]"
>> z = Array.class_eval(y)
=> ["a"]
>> x == z
=> true
Run Code Online (Sandbox Code Playgroud)

我怀疑使用的安全岬class_eval不过,警惕的用户输入,因为它可能会产生非预期的副作用(和我的意思是代码注入攻击),除非你非常确定你知道的原始数据从哪里来来自,或允许通过它.