1

我正在尝试转义给定字符串中的一个或多个以下字符:'、" 和 \

我试图用正则表达式来做到这一点,它工作得很好,但不是在 javascript 中,因为引擎在功能方面非常有限。

问题基本上是它需要处理预先转义的序列。请参阅以下示例:

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

等等。同样的逻辑也适用于单引号和反斜杠。

谁能指出我如何在javascript中实现这一目标的正确方向?

提前致谢。

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"其替换为强制反斜杠,后跟要转义的字符。

于 2013-05-26T14:24:51.117 回答
1

如果你不知道如何用 RegExp 来做,为什么不写一个函数呢?

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确实提供了两个(标准)本机函数,可以实现净化结果(尽管与上述不同)。它们分别是, 反过来是和。根据您要对字符串执行的操作,这些函数可能更可取。encodeURI encodeURIComponentdecodeURIdecodeURIComponent

我还要补充一点,如果您想清理字符串以保护您的服务器,请在服务器端进行清理,因为即使您有客户端清理,您也不能相信来自客户端机器的任何数据都是安全的.

于 2013-05-26T13:56:56.170 回答