Ruby:转义字符串中的特殊字符

时间:2010-11-10 01:56:41

标签: ruby regex escaping

我正在尝试编写一个与PHP中的mysqli_real_escape_string相同的方法。它需要一个字符串并逃脱任何“危险”的角色。我已经找了一种方法可以为我做这个,但我找不到一个。所以我试着自己写一个。

这是我到目前为止(我在Rubular.com测试了模式并且它有效):

# Finds the following characters and escapes them by preceding them with a backslash. Characters: ' " . * / \ -
def escape_characters_in_string(string)
  pattern = %r{ (\'|\"|\.|\*|\/|\-|\\) }
  string.gsub(pattern, '\\\0') # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that).
end

我正在使用start_string作为我想要更改的字符串,correct_string正如我想要start_string转变为:

start_string = %("My" 'name' *is* -john- .doe. /ok?/ C:\\Drive)
correct_string = %(\"My\" \'name\' \*is\* \-john\- \.doe\. \/ok?\/ C:\\\\Drive)

有人可以尝试帮助我确定为什么我没有得到我想要的输出(correct_string)或者告诉我在哪里可以找到这样做的方法,或者更好地告诉我两者?非常感谢!

5 个答案:

答案 0 :(得分:11)

您的模式未在示例中正确定义。这就像我可以得到你想要的输出一样接近。

输出

"\\\"My\\\" \\'name\\' \\*is\\* \\-john\\- \\.doe\\. \\/ok?\\/ C:\\\\Drive"

你需要做一些调整才能100%获得它,但至少你现在可以看到你的模式。

  def self.escape_characters_in_string(string)
    pattern = /(\'|\"|\.|\*|\/|\-|\\)/
    string.gsub(pattern){|match|"\\"  + match} # <-- Trying to take the currently found match and add a \ before it I have no idea how to do that).
  end

答案 1 :(得分:4)

我已经改变了以上功能:

  def self.escape_characters_in_string(string)
    pattern = /(\'|\"|\.|\*|\/|\-|\\|\)|\$|\+|\(|\^|\?|\!|\~|\`)/
    string.gsub(pattern){|match|"\\"  + match}
  end

这对正则表达式非常有用

答案 2 :(得分:2)

这应该让你开始:

print %("'*-.).gsub(/["'*.-]/){ |s| '\\' + s }
\"\'\*\-\.

答案 3 :(得分:1)

答案 4 :(得分:0)

查看Mysql类here

中的escape_string / quote方法