2010-11-10 5 views
7

J'essaie d'écrire une méthode qui est la même que mysqli_real_escape_string en PHP. Il prend une chaîne et échappe à tous les personnages «dangereux». J'ai cherché une méthode qui va le faire pour moi mais je ne peux pas en trouver un. Donc j'essaye d'en écrire un seul.Ruby: Echapper des caractères spéciaux dans une chaîne

C'est ce que j'ai jusqu'à présent (je l'ai testé le modèle à Rubular.com et cela a fonctionné):

# 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 

Et je me sers start_string que la chaîne que je veux changer, et correct_string comme ce que je veux start_string de se transformer en:

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

quelqu'un peut-il essayer de me aider à comprendre pourquoi je ne reçois pas ma sortie désirée (correct_string) ou me dire où je peux trouver une méthode qui fait cela, ou encore mieux dire m Les deux? Merci beaucoup!

+0

Si vous mettez '' start_string' dans escape_characters_in_string' et vous ne recevez pas ce que vous » vous attendez? Quelle est cette sortie incorrecte? Vous nous avez donné ce que vous attendez de voir, maintenant dites ce que vous voyez réellement ... – masher

+0

Quand je "met" les résultats de "escape_characters_in_string (start_string)", rien ne change; il imprime le contenu de 'start_string' – agentbanks217

+0

Regexp.escape (str) –

Répondre

9

Votre modèle ISN 't défini correctement dans votre exemple. C'est aussi proche que je peux obtenir à votre sortie désirée.

Sortie

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

Il va prendre quelques ajustements de votre part pour obtenir 100% mais au moins vous pouvez voir votre modèle en action maintenant.

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 
+0

C'est fait! Merci beaucoup! – agentbanks217

+0

Heureux que ça a marché pour vous. – rwilliams

0

Jetez un oeil à escape_string/méthode de cotation en classe Mysql here

2

Cela devrait vous aider à démarrer:

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

J'ai changé ci-dessus fonctionnent comme ceci:

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

Cela fonctionne très bien pour regex

+0

Refroidir sa couverture tous les caractères spéciaux .... –

Questions connexes