2009-04-20 29 views
50

¿Tiene JavaScript una función integrada como la función addslashes de PHP (o addcslashes) para agregar barras diagonales inversas a los caracteres que necesitan escaparse en una cadena?Escapar cadenas en JavaScript

Por ejemplo, esto:

Ésta es una cadena de demostración con 'comillas simples' y "comillas dobles".

... se convertiría en:

Ésta es una cadena de demostración con \ 'comillas simples' y \ \ "comillas dobles \".

+7

"¿Necesita escapar? ¿Para qué? Hay muchas razones diferentes para escapar de cadenas, y la forma correcta de hacerlo puede ser diferente dependiendo del objetivo. (Por ejemplo, las addslashes de PHP() suelen ser la solución incorrecta cuando se trata de SQL: una mejor solución son las consultas parametrizadas) – Miles

+0

Actualmente estoy desarrollando un Widget de tablero de Apple, y quiero que mis cadenas escapen correctamente antes de usarlas en comandos de Terminal a través de "widget.system". –

+0

@SteveHarrison Esto probablemente sea inseguro. Habrá formas de salir de esto, permitiendo la ejecución de código arbitrario. Los proyectiles hacen cosas raras con sus comentarios. Si planeas pasar datos que no son de confianza, la única forma de evitar tener que hacer backflips para 'system' es usar alguna otra función que te permita pasar parámetros no guardados. –

Respuesta

75

http://locutus.io/php/strings/addslashes/

function addslashes(str) { 
    return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'); 
} 
+32

Entonces, la respuesta es "no, no hay función incorporada como addslashes de PHP" –

+0

Sí, esa es la respuesta. –

+5

Bueno, añadiré esta función a mi [siempre creciente] colección de funciones/métodos que faltan en JavaScript ... ¡Gracias! –

36

Una variación de la función proporcionada por Paolo Bergantino que trabaja directamente en la secuencia:

String.prototype.addSlashes = function() 
{ 
    //no need to do (str+'') anymore because 'this' can only be a string 
    return this.replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0'); 
} 

Al añadir el código anterior en su biblioteca podrá hacer:

var test = "hello single ' double \" and slash \\ yippie"; 
alert(test.addSlashes()); 

EDIT:

las propuestas efectuadas en los comentarios, el que está preocupado por los conflictos entre bibliotecas de JavaScript pueden añadir el siguiente código:

if(!String.prototype.addSlashes) 
{ 
    String.prototype.addSlashes = function()... 
} 
else 
    alert("Warning: String.addSlashes has already been declared elsewhere."); 
+6

Vale la pena señalar que la extensión de los objetos JavaScript nativos es considerada por muchas malas prácticas. –

+5

@BenjaminGruenbaum: si tiene miedo a los conflictos, puede agregar 'if (! String.prototype.addSlasches)' antes de extender –

+1

¿Cómo funciona eso? Si esperas una función de agregar barras y obtienes otra, es probable que termines con un error muy difícil de encontrar. Es mejor arrojar una excepción si hay un conflicto –

51

También puede probar esto para las comillas dobles :

JSON.stringify(sDemoString).slice(1, -1); 
JSON.stringify('my string with "quotes"').slice(1, -1); 
+3

Esta es una excelente respuesta. Me sorprende que no haya un método "obvio" incorporado para escapar de las comillas, pero esto hace el trabajo. ¿Hay alguna advertencia? – Medorator

+1

El resultado de JSON.stringify() con una cadena es una cadena con comillas dobles alrededor de la cadena. Es la cadena que, cuando se evalúa, dará como resultado la misma cadena con la que comenzó. Así que JSON.stringify ('mi cadena con' cotiza '') devuelve la cadena: "mi cadena con \" cita \ "'', que puede ingresar en JavaScript como '' mi cadena con \ '' cotizaciones \ '' ''. – dlaliberte

+1

Esto es excelente. Necesita más exposición. – mattsven

Cuestiones relacionadas