Ruby: экранирование специальных символов в строке - PullRequest
8 голосов
/ 10 ноября 2010

Я пытаюсь написать метод, аналогичный mysqli_real_escape_string в PHP.Он принимает строку и экранирует любые «опасные» символы.Я искал метод, который сделает это для меня, но я не могу найти один.Поэтому я пытаюсь написать один самостоятельно.

Это то, что у меня есть до сих пор (я тестировал шаблон на 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 ]

11 голосов
/ 10 ноября 2010

Ваш шаблон не определен правильно в вашем примере.Это настолько близко, насколько я могу получить к вашему желаемому выводу.

Вывод

"\\\"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
4 голосов
/ 28 января 2014

Я изменил вышеуказанную функцию следующим образом:

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

Это прекрасно работает для регулярных выражений

2 голосов
/ 10 ноября 2010

Это должно помочь вам начать:

print %("'*-.).gsub(/["'*.-]/){ |s| '\\' + s }
\"\'\*\-\.
1 голос
/ 10 ноября 2010

Взгляните на методы очистки ActiveRecord: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-sanitize_sql_array

0 голосов
/ 10 ноября 2010

Взгляните на метод escape_string / quote в классе Mysql здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...