web-dev-qa-db-ja.com

javascriptを使用して文字列内の二重引用符をエスケープ文字の二重引用符に置き換えるにはどうすればよいですか?

次のような文字列変数(_var str_)があるとします

おい、彼は「You Rock!」と完全に言った

今、私はそれが次のように見えるようにする場合

おい、彼は完全に\ "You Rock!\"と言った

JavaScript replace()関数を使用してこれを達成するにはどうすればよいですか?

str.replace("\"","\\"");はうまく機能していません。 _unterminated string literal_エラーが発生します。

さて、上記の文をSQLデータベースに保存する場合、MySQLで[〜#〜] longtext [〜#〜](またはその他の[〜#〜 ] varchar [〜#〜]-ish)データ型、実行する必要のある他の文字列最適化は何ですか?引用符とカンマは、クエリ文字列にはあまり適していません。その点についてもいくつかの提案をいただければ幸いです。

33
Samik Sengupta

これにはグローバル正規表現を使用する必要があります。この方法で試してください

str.replace(/"/g, '\\"');

置換機能の正規表現の構文とオプションはこちらをご覧ください。

http://www.regular-expressions.info/javascript.html

56

これを試して:

_str.replace("\"","\\\""); // (escape backslashes and embedded double-quotes)
_

または、一重引用符を使用して検索を引用し、文字列を置換します。

_str.replace('"','\\"');   // (still need to escape the backslash)
_

更新:helmusが指摘したように、.replace()に渡される最初のパラメーターが文字列の場合、最初に出現したもののみを置き換えます。グローバルに置き換えるには、g(グローバル)フラグを使用して正規表現を渡す必要があります。

_str.replace(/"/g,"\\\"");
// or
str.replace(/"/g,'\\"');
_

しかし、なぜあなたはJavaScriptでこれをしているのですか?次のような文字列リテラルがある場合、これらのエスケープ文字を使用しても問題ありません。

_var str = "Dude, he totally said that \"You Rock!\"";
_

しかし、これは必要ですのみ文字列リテラルで。つまり、ユーザーがフォームフィールドに入力した値にJS変数が設定されている場合、このエスケープは必要ありません。

このような文字列をSQLデータベースに保存することに関する質問については、SQLステートメントに文字列リテラルを埋め込む場合にのみ文字をエスケープする必要があります-そして、SQLに適用されるエスケープ文字は(通常) JSと同じです。サーバー側でSQL関連のエスケープを行います。

6
nnnnnn

他の答えはほとんどの文字列で機能しますが、すでにエスケープされている二重引用符のエスケープを解除できます。

正しく動作するには、すべてのバックスラッシュをエスケープしてから、次のようにすべての二重引用符をエスケープする必要があります。

var test_str = '"first \\" middle \\" last "';
var result = test_str.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');

文字列の使用方法や、関係する他のエスケープ文字によっては、これにはまだいくつかの問題があるかもしれませんが、ほとんどの場合はおそらく機能すると思います。

3
derekmc
var str = 'Dude, he totally said that "You Rock!"';
var var1 = str.replace(/\"/g,"\\\"");
alert(var1);
0
F0G