web-dev-qa-db-ja.com

JavaScript評価のためのJavaScript文字列での単一引用符のエスケープ

私はいくつかのJavaScript変数が評価されるプロジェクトを持っています。文字列をエスケープする必要があるため(単一引用符のみ)、テスト関数でまったく同じコードを記述しました。次の非常に単純なJavaScriptコードがあります。

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);
}

そして、私はそれを警告したい:fsdsd'4565sd

29
Florian Mertens

問題は、.replace()は文字列自体を変更しないため、次のように記述する必要があることです。

strInputString = strInputString.replace(...

また、キャラクターのエスケープを正しく行っていないようです。次は私のために働いた:

strInputString = strInputString.replace(/'/g, "\\'");
77

このvar formattedString = string.replace(/'/g, "\\'");は非常にうまく機能することに同意しますが、コードのこの部分をフレームワークPradoでPHPで使用したため(jsスクリプトはPHP class)このサンプルは二重引用符内で動作する必要がありました。

私のために働いた解決策は、3つの_\_を入れて二重引用符をエスケープする必要があるということです。 "var string = \"l'avancement\"; var formattedString = string.replace(/'/g, \"\\\'\");"

3つの_\_が回避策であることがわかりませんでしたので、私はその質問に答えます。

2
YziGer

JSON.stringify()を使用して、バックスラッシュやその他の特殊文字など、すべてのベースをカバーするのが最適です。

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

周囲の二重引用符が追加されるため、単一引用符を含める必要はありません。

1
Kev

これだけが私のために働いた:

searchKeyword.replace("\'", "\\\'");//searchKeyword contains "d'av"

したがって、結果変数には「d\'av」が含まれます。

おそらく私が使用しているJSフレームワーク(Backbone.js)が原因で、RegExが機能しなかった理由がわかりません

0
João Ox Oc