ruby - poner - tinte pelo
¿Cómo puedo escapar de una sola cita en Ruby? (4)
Estoy pasando algo de JSON a un servidor a través de un script (no mío) que acepta el JSON como una cadena.
Parte del contenido de JSON contiene comillas simples, por lo que quiero asegurarme de que se escapen las comillas antes de pasarlas al script.
He probado lo siguiente:
> irb
> 1.9.3p194 :001 > x = "that''s an awesome string"
> => "that''s an awesome string"
> 1.9.3p194 :002 > x.sub("''", "/'")
> => "that''s an awesome string"
> 1.9.3p194 :003 > x.sub("''", "//'")
> => "thats an awesome strings an awesome string"
pero parece que no puede obtener la sintaxis correcta.
¿Por qué no estás usando la gema JSON?
require ''json''
some_object = {''a string'' => "this isn''t escaped because JSON handles it.", ''b'' => 2}
puts some_object.to_json
=> {"a string":"this isn''t escaped because JSON handles it.","b":2}
Y un ejemplo de ida y vuelta:
require ''pp''
pp JSON[some_object.to_json]
=> {
"a string" => "this isn''t escaped because JSON handles it.",
"b" => 2
}
Y un ejemplo con comillas dobles:
some_object = {
''a string'' => "this isn''t escaped because JSON handles it.",
''another string'' => ''double-quotes get "escaped"''
}
puts some_object.to_json
=> {
"a string" => "this isn''t escaped because JSON handles it.",
"another string" => "double-quotes get /"escaped/""
}
Es probable que si está tratando de escapar de una sola cita (apóstrofe), también quiera evitar las comillas dobles. (Esto aplicaría para Javascript / JSON)
La forma más fácil es usar escape_javascript
http://api.rubyonrails.org/classes/ActionView/Helpers/JavaScriptHelper.html "Escapa los retornos de carro y las comillas simples y dobles para los segmentos de JavaScript".
NOTA: esto funciona solo para Ruby on Rails , no para Ruby simple. Sin embargo, puedes hacer un polyfill para Ruby simple usando algo como esto:
JS_ESCAPE_MAP = { ''//' => ''////', ''</'' => ''<//'', "/r/n" => ''/n'', "/n" => ''/n'', "/r" => ''/n'', ''"'' => ''//"'', "''" => "//'" }
def escape_javascript(javascript)
if javascript
result = javascript.gsub(/(/|<//|/r/n|/342/200/250|/342/200/251|[/n/r"''])/u) {|match| JS_ESCAPE_MAP[match] }
else
''''
end
end
Intente de esta manera, use la barra invertida para escapar:
puts ''sean/'s''
la salida debe ser:
sean''s
La razón sub("''", "/'")
no funciona es porque "/'"
es lo mismo que "''"
. Dentro de las comillas dobles, el escape de una comilla simple es opcional.
El motivo sub("''", "//'")
no funciona porque "//'"
expande a una barra invertida seguida de una comilla simple. Dentro del argumento sub
o gsub
, una barra invertida seguida de algunos caracteres tiene un significado especial comparable a la variable global correspondiente. Particularmente en este caso, la variable global $''
mantiene la subcadena después del último punto coincidente. Su "//'"
dentro de la posición del argumento sub
o gsub
refiere a una cosa similar. Para evitar esta convención especial, debe colocar la cadena de reemplazo en un bloque en lugar de un argumento, y como desea hacer coincidir no solo una, debe usar gsub
lugar de sub
:
gsub("''"){"//'"}