web-dev-qa-db-fra.com

Échapper aux guillemets simples dans la chaîne JavaScript pour l'évaluation de JavaScript

J'ai un projet dans lequel une variable JavaScript est évaluée. Comme la chaîne doit être échappée (guillemets simples uniquement), j'ai écrit exactement le même code dans une fonction de test. J'ai le code JavaScript assez simple suivant:

function testEscape() {
    var strResult = "";
    var strInputString = "fsdsd'4565sd";

    // Here, the string needs to be escaped for single quotes for the eval 
    // to work as is. The following does NOT work! Help!
    strInputString.replace(/'/g, "''");

    var strTest = "strResult = '" + strInputString + "';";
    eval(strTest);
    alert(strResult);
}

Et je veux l'alerter en disant: fsdsd'4565sd.

27
Florian Mertens

Le fait est que .replace() ne modifie pas la chaîne elle-même, vous devriez donc écrire quelque chose comme:

strInputString = strInputString.replace(...

Il semble également que vous ne vous échappiez pas correctement. Ce qui suit a fonctionné pour moi:

strInputString = strInputString.replace(/'/g, "\\'");
74
Nikita Tkachenko

Je conviens que cette var formattedString = string.replace(/'/g, "\\'"); fonctionne très bien, mais puisque j’utilise cette partie de code dans PHP avec le framework Prado (vous pouvez enregistrer le script js dans une classe PHP), j’avais besoin de cet exemple pour travailler en double citations. 

La solution qui a fonctionné pour moi est que vous devez mettre trois \ et échapper aux guillemets ."var string = \"l'avancement\"; var formattedString = string.replace(/'/g, \"\\\'\");"

Je réponds à cette question car j'avais du mal à trouver que trois \ étaient le moyen de contourner le problème.

2
YziGer

Il est préférable d’utiliser JSON.stringify() pour couvrir toutes vos bases, telles que les barres obliques inverses et autres caractères spéciaux:

var strTest = "strResult = " + JSON.stringify(strInputString) + ";";
eval(strTest);
alert(strResult);

Notez qu'il ajoute ses propres guillemets, ce qui vous évite d'avoir à inclure des guillemets simples.

0
Kev