2012-05-11 9 views
38

Tengo una cadena muy grande que necesita para escapar de todas las comillas simples en ella, por lo que puedo alimentar a JavaScript sin molestarlo. No tengo control sobre la cadena externa, por lo que no puedo cambiar la fuente de datos.Reemplazar comilla simple con comilla inversa comilla simple

Ejemplo:

Cote d'Ivoir -> Cote d\'Ivoir 

(la cadena real es muy largo y contiene muchas citas individuales)

que estoy tratando de esto mediante el uso gsub en la cadena, pero no puede conseguir que esto trabajo:

a = "Cote d'Ivoir" 
a.gsub("'", "\\\'") 

pero esto me da:

=> "Cote dIvoirIvoir" 

También probé:

a.gsub("'", 92.chr + 39.chr) 

pero dieron el mismo resultado; Sé que tiene algo que ver con las expresiones regulares, pero nunca las obtengo.

+0

Es posible que desee considerar también el escape de comillas dobles, ya que alguien puede actualmente romper su programa al ingresar al país 'My Nefarious' como su país. Es lo que hace Rails con su ayudante 'escape_javascript' http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html –

Respuesta

50

El% Los delimitadores q son útiles aquí:

# %q(a string) is equivalent to a single-quoted string 
puts "Cote d'Ivoir".gsub("'", %q(\\\')) #=> Cote d\'Ivoir 
+3

En realidad, su ejemplo devuelve "Cote d \\ 'Ivoir", no "Cote d \' Ivoir", que es el resultado deseado. –

+6

@Dave: 'p (" Cote d'Ivoir ".gsub (" '",% q (\\\'))). Size' devuelve 13. (IRB usa \\ para hacer un escape- \ visible). – steenslag

+0

Niza ... trabajo para mí ... muchas gracias .. – harsh4u

20

El problema es que \' en un reemplazo gsub significa "parte de la cadena después de la coincidencia".

usted es probablemente la mejor manera de utilizar la sintaxis del bloque:

a = "Cote d'Ivoir" 
a.gsub(/'/) {|s| "\\'"} 
# => "Cote d\\'Ivoir" 

o la sintaxis Hash:

a.gsub(/'/, {"'" => "\\'"}) 

También existe la solución hacky:

a.gsub(/'/, '\#').gsub(/#/, "'") 
+1

Todos esos ejemplos dan" Cote d \\ 'Ivoir "no" Cote d \' Ivoir " –

+0

@DaveSag - Recuerde que, en una cadena '' ', el \ necesitará ser escapado. La cadena contiene' \ '', que se representa como' '\\'" '. – Chowlett

+0

La forma más fácil de demostrar lo que REPL hace con "\\" es poner la cadena 'str =" Costa de Marfil " # =>" Costa de Marfil "' 'str =" Costa de Marfil " # => "Costa de Marfil" '' cadena = "\\ Costa de Marfil" # => "\\ Costa de Marfil" '' pone str de Cote d \ 'Ivoire # => las negativas – Nultyi

Cuestiones relacionadas