Ruby: экранирование специальных символов в строке

Я пытаюсь написать метод, который совпадает с 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, '') # <-- 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 как то, что я хочу!--3--> в свою очередь в:

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

может кто-нибудь помочь мне выяснить, почему я не получаю желаемого результата (correct_string) или подскажите, где я могу найти метод, который делает это, или даже лучше сказать мне как? Большое спасибо!

5 ответов


ваш шаблон не определен правильно в вашем примере. Это как можно ближе к желаемому результату.

выход

"\\"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

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

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

это отлично работает для regex


Это должно вам начать работу:

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

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


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