1

I am trying to escape one or several of the following characters in a given string: ', " and \

I have attempted to do this with regular expressions, which works fine, but not in javascript seeing as how the engine is very limited feature-wise.

The problem is basically it needs to handle pre-escaped sequences. See examples below:

foo"bar  --->  foo\"bar
foo\"bar --->  foo\"bar
foo\\"bar -->  foo\\\"bar
foo\\\"bar ->  foo\\\"bar

Etc. Same logic applies for the single quotes and backslashes too.

Can anybody point me in the right direction of how to acheive this in javascript?

Thanks in advance.

4

2 に答える 2

2
var arr = ["foo\"bar", "foo\\\"bar", "foo\\\\bar", "foo\\\\\"bar",
           "foo\\bar", "foo\\\\\\bar"];
for (var i = 0; i < arr.length; ++i) {
  console.log(arr[i] + " -> " + arr[i].replace(/\\?([\\'"])/g, "\\$1"));
}

収量

foo"bar -> foo\"bar
foo\"bar -> foo\"bar
foo\\bar -> foo\\bar
foo\\"bar -> foo\\\"bar
foo\bar -> foo\\bar
foo\\\bar -> foo\\\\bar

/\\?([\\'"])/gオプションで前にバックスラッシュを付けてリストした文字の 1 つと一致"\\$1"し、必須のバックスラッシュとそれに続くエスケープする文字に置き換えます。

于 2013-05-26T14:24:51.117 に答える
1

正規表現でそれを行う方法がわからない場合は、関数を作成してみませんか?

function esc(s) {
    var out = '', i, escaped = 0, c;
    for (i = 0; i < s.length; ++i) { // loop over string
        c = s.charAt(i);
        if (c === '\\') escaped = 1 - escaped; // get escaped state
        else {
            if (c === "'" || c === '"') { // if quote
                if (escaped === 0) out += '\\'; // escape if not escaped
                else escaped = 0; // else reset escaped state
            } else if (escaped) out += '\\', escaped = 0; // else close escape
        }
        out += c;
        // console.log(s, i, c, escaped, out);
    }
    return out;
}

esc('foo"bar');       // foo"bar    -> foo\"bar
esc('foo\\"bar');     // foo\"bar   -> foo\"bar
esc('foo\\\\"bar');   // foo\\"bar  -> foo\\\"bar
esc('foo\\\\\\"bar'); // foo\\\"bar -> foo\\\"bar

JavaScriptは、サニタイズされた結果を実現できる 2 つの (標準の) ネイティブ関数を提供します (ただし、上記とは異なります)。これらはで、逆はそれぞれとです。文字列で何をしたいかによっては、これらの関数が望ましい場合があります。encodeURI encodeURIComponentdecodeURIdecodeURIComponent

また、サーバーを保護するために文字列をサニタイズする場合は、サニタイズをサーバー側で行ってください。クライアント側でサニタイズを行ったとしても、クライアントのマシンからのデータが安全であるとは信頼できないためです。 .

于 2013-05-26T13:56:56.170 に答える