如何在Ruby或Rails中将变量中的双引号或单引号转义?

3
我正在后端构建一个js文件以备将来使用,需要将宏转换为js代码。在下面的方法中,我的gsub一直工作得很好,直到我有了一个带有双引号的url。如果我有一个变量quote_type = "'",那么如何将其作为转义引号插入?换句话说.. "'" 变成 "\'"'"' 变成 '\"' 这是我的现有方法,我刚刚添加了quote_type变量来尝试这个。
def substitute_timestamp_macro!(string)
  quote_type = string[0]
  string.gsub('[timestamp]', '\' + new Date().getTime() + \'')
end

编辑:示例字符串为"https://doesntmatter.com/stuff/123;time=[timestamp]?"

编辑2:期望结果如下: "https://doesntmatter.com/stuff/123;time=" + new Date().getTime() + "?"

这是实际结果: "https://doesntmatter.com/stuff/123;time=' + new Date().getTime() + '?"

注意在我的gsub中,我硬编码了一个转义的单引号。现在我想使用变量来匹配输入引号,所以如果是单引号,使用单引号,如果是双引号,使用双引号。


你能展示预期结果和实际结果吗? - max pleaner
@maxpleaner 请查看编辑2。 - cheeseandpepper
我的问题的第一部分是关于你所指的双引号。你所指的双引号是围绕示例字符串的双引号吗?这些双引号包含在您接收到的URL值中,还是您还有其他要问的内容? - Michael Gaskill
@tadman在JS中无法做到这一点。我们正在后端构建文件(通过表单),以便前端不做任何事情,只加载最终文件。 - cheeseandpepper
显然,你可以在JavaScript中完成这个任务,因为你正在发送一个包含JavaScript的字符串。这种方式可能更安全,因为你不需要担心使用哪种引号。我认为expand("...[timestamp]")比这里的方法更安全、更通用,除非你要放入一些特定于Rails的数据。 - tadman
显示剩余5条评论
2个回答

3
考虑使用%()来包装你的字符串:
def substitute_timestamp_macro!(string)
  %("#{string}").gsub("[timestamp]", %(" + new Date().getTime() + "))
end

请注意,这将呈现一个带有转义双引号的字符串:
substitute_timestamp_macro!("https://doesntmatter.com/stuff/123;time=[timestamp]")
=> "\"https://doesntmatter.com/stuff/123;time=\" + new Date().getTime() + \"?\""

当您将其呈现到缓冲区时,这将被正确解释:
puts substitute_timestamp_macro!("https://doesntmatter.com/stuff/123;time=[timestamp]")
=> "https://doesntmatter.com/stuff/123;time=" + new Date().getTime() + "?"

这个可以!我需要进行一些微调,但我可以看到这对我有用。谢谢! - cheeseandpepper
没问题,祝你好运! - Anthony E

0

值的周围引号字符确定此函数的行为,这应该适合你的要求:

def substitute_timestamp_macro!(string)
  quote_type = string[0]
  string.gsub('[timestamp]', "\\#{quote_type} + new Date().getTime() + \\#{quote_type}")
end

谢谢...不幸的是,在我的情况下,quote_type需要转义。现在我想想,也许字面上的转义也可以工作?"\\#{quote_type}" - cheeseandpepper
我明白了。我会更新答案以便在这方面是正确的。 - Michael Gaskill
而字面上的转义是最直接的解决方案,所以这就是我使用的方法。谢谢! - Michael Gaskill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接