Javascript 在给定字符串中转义引号和/或反斜杠

Javascript 在给定字符串中转义引号和/或反斜杠,javascript,Javascript,我试图对给定字符串中的以下一个或几个字符进行转义:“,”和\ 我尝试用正则表达式来实现这一点,正则表达式工作得很好,但在javascript中却没有,因为引擎在功能方面非常有限 问题是它基本上需要处理预转义序列。请参见下面的示例: foo"bar ---> foo\"bar foo\"bar ---> foo\"bar foo\\"bar --> foo\\\"bar foo\\\"bar -> foo\\\"bar 同样的逻辑也适用于单引号和反斜杠 有人能告

我试图对给定字符串中的以下一个或几个字符进行转义:“,”和\

我尝试用正则表达式来实现这一点,正则表达式工作得很好,但在javascript中却没有,因为引擎在功能方面非常有限

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

foo"bar  --->  foo\"bar
foo\"bar --->  foo\"bar
foo\\"bar -->  foo\\\"bar
foo\\\"bar ->  foo\\\"bar
同样的逻辑也适用于单引号和反斜杠

有人能告诉我如何用javascript实现这一点的正确方向吗


提前感谢。

如果您不知道如何使用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;
}

JavaScript确实提供了两个(标准)本机函数,它们可以实现净化的结果(尽管与上述不同)。这两个函数分别是
decodeURI
decodeURIComponent
。根据您希望对字符串执行的操作,这些函数可能更可取

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

var arr=[“foo\”bar、“foo\\\”bar、“foo\\\\\\\bar”、“foo\\\\\\bar”,
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”]; 对于(变量i=0;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”
将其替换为强制反斜杠,后面加上要转义的字符。

会帮您解决问题吗?在什么上下文中,您试图转义字符的目的是什么?如果没有这些信息,这个问题是无法回答的,因为有许多不同的答案。@Pointy:我只是想输出经过净化的数据。我不会将其用于任何特定用途,但我希望输出正确且经过消毒。对,但是:在服务器上,这种“卫生”发生在哪里?在其他JavaScript代码中?而卫生设施的目标是什么:JavaScript解析器本身?HTML?还有什么吗?要想消毒或逃跑,你必须知道你逃跑是为了什么。在普通Javascript中,没有明显的上下文需要这种手动转义。因此,请澄清。如果您在运行此表达式时说一些类似于
\n
的内容,而这些内容应该保持不变,则它会变成
\\n
您没有要求这样的行为。只需将
[\\'”]
更改为包含允许转义的所有字符
[\\'”rn]
,等等+1,因为这是一个在JavaScript中工作的RegExp解决方案。我主要是检查是否有一种巧妙的方法,或者是否有我不知道的任何内置函数。无论哪种方式,我都得到了两个很好的答案,我可以根据这两个答案编写新代码。
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"));
}