一直在破解几个库,遇到一个字符串被“双重转义”的问题。
例如: 固定示例
> x = ['a']
=> ["a"]
> x.to_s
=> "[\"a\"]"
>
然后再到
\"\[\\\"s\\\"\]\"
这是在处理 http header 时发生的。我有一个 header ,它将是一个数组,但 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
...一定有更好的方法...(无需猴子修补我正在使用的 gems)。 (是的,如果我的字符串实际上包含这些字符串,就会中断。)
建议?
** 更新 2 **
好的。在这附近仍然有麻烦,但现在我想我已经找到了核心问题。它在 to_s 调用后将我的数组序列化为 json。至少,这似乎重现了我所看到的。
['a'].to_s.to_json
我在 gem 中调用一个返回 to_s 结果的方法,然后在其上调用 to_json。
最佳答案
由于您修改过的问题,我修改了我的答案:
我仍然无法复制您的结果!
>> x = ['a']
=> ["a"]
>> x.to_s
=> "a"
但是当我将最后一次调用更改为:
>> x.inspect
=> "[\"a\"]"
所以我假设这就是您正在做的事情?
它不一定转义值 - 本身。它像这样存储字符串:
%{["a"]}
或者更确切地说:
'["a"]'
无论如何。这应该可以取消字符串化:
>> x = ['a']
=> ["a"]
>> y = x.inspect
=> "[\"a\"]"
>> z = Array.class_eval(y)
=> ["a"]
>> x == z
=> true
虽然我对使用 class_eval
的安全性持怀疑态度,但要警惕用户输入,因为它可能会产生意想不到的副作用(我指的是代码注入(inject)攻击),除非你非常确定您知道原始数据的来源,或者允许通过它的内容。
关于ruby-on-rails - Ruby (Rails) 取消转义字符串 -- undo Array.to_s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5235124/