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