JavaScript中的字符串转义

83
JavaScript有没有像PHP中的addslashes(或addcslashes)这样的内置函数,用于向需要转义的字符添加反斜杠?
例如,将此字符串:
``` This is a demo string with 'single-quotes' and "double-quotes". ```
转换为:
``` This is a demo string with \'single-quotes\' and \"double-quotes\". ```

8
“Need escaping”是为了什么目的?转义字符串有许多不同的原因,正确的转义方式取决于目标。例如,当涉及到 SQL 时,PHP 的 addslashes() 通常不是正确的解决方案:更好的解决方案是使用参数化查询。 - Miles
我正在开发一个苹果 Dashboard Widget,我希望在通过 "widget.system" 使用它们之前,我的字符串能够被正确转义。 - Steve Harrison
@SteveHarrison 这可能是不安全的。有办法可以打破这个限制,从而实现任意代码执行。Shell 对其输入进行了奇怪的处理。如果您计划传递不受信任的数据,则避免使用 system 需要做出各种反应的唯一方法是使用其他函数,该函数允许您传递未转义的参数。 - Jo Liss
4
下面是@Storm的回答:“使用JSON.stringify”。 这不是一个很好的替代方案吗? - user
1
JavaScript:转义特殊字符 - Damodaran
PHP有addslashes函数来添加反斜杠?我为什么不感到惊讶呢? - rsp
5个回答

105

59
那么答案是“不,没有类似于PHP中addslashes的内置函数。” - Rick Copeland
8
好的,我会将这个函数添加到我的[越来越多的]缺失于JavaScript中的函数/方法集合中...谢谢! - Steve Harrison
11
请问您能解释一下 '\u0000' 替换的意思吗?谢谢。 - Tom Pažourek
1
\u0000是一个空字符。我不确定为什么需要将其删除。 - N-ate
在添加新斜杠之前,我们如何检查字符串中是否包含斜杠? - Israel Obanijesu

105

你也可以尝试这个方法处理双引号:

JSON.stringify(sDemoString).slice(1, -1);
JSON.stringify('my string with "quotes"').slice(1, -1);

4
这是一个很好的答案。我很惊讶没有“显而易见”的内置方法来转义引号,但这个方法可以完成工作。有什么注意事项吗? - user
1
JSON.stringify() 方法将字符串作为参数,返回一个带有双引号的字符串。这个字符串在被解析后会得到与原始字符串相同的结果。例如,JSON.stringify('my string with "quotes"') 返回字符串:"my string with "quotes"",在 JavaScript 中可以表示为 '"my string with "quotes""'. - dlaliberte
1
一个缺点是像\x00这样的东西不被支持,而是用更长的\u0000来表示。 - gengkev
10
这也包括换行符、制表符等其他答案忽略的特殊字符,而且不会列出所有可能的特殊字符。这是最好的答案。值得注意的是,它只转义 " 而不是 ' - Hashbrown
1
美丽、优雅、高效。我用它来调试我正在编写的一些解析器——非常有用。 - stevendesu
显示剩余4条评论

40

这是一个直接作用于字符串的函数变体,来自 Paolo Bergantino:

String.prototype.addSlashes = function() 
{ 
   //no need to do (str+'') anymore because 'this' can only be a string
   return this.replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');
} 
在您的库中添加上述代码,您将能够执行以下操作:
var test = "hello single ' double \" and slash \\ yippie";
alert(test.addSlashes());

编辑:

根据评论中的建议,对于担心 JavaScript 库冲突的人可以添加以下代码:

if(!String.prototype.addSlashes)
{
   String.prototype.addSlashes = function()... 
}
else
   alert("Warning: String.addSlashes has already been declared elsewhere.");

8
值得注意的是,许多人认为扩展本机JavaScript对象是不良实践。 - Benjamin Gruenbaum
6
如果你害怕冲突,你可以在扩展之前添加 if (!String.prototype.addSlashes) - Marco Demaio
1
那会怎样有帮助呢?如果你期望得到一个“addSlashes”函数,但是却得到了另外一个函数,你可能会最终遇到一个非常难以找到的错误。如果有冲突最好抛出异常。 - B T
4
@BT:一个 addSlashes 函数实际上应该以某种方式添加斜杠。无论如何,我已经更新了回答中的代码以反映您的建议。 - Marco Demaio

2

0

你也可以使用这个

let str = "hello single ' double \" and slash \\ yippie";

let escapeStr = escape(str);
document.write("<b>str : </b>"+str);
document.write("<br/><b>escapeStr : </b>"+escapeStr);
document.write("<br/><b>unEscapeStr : </b> "+unescape(escapeStr));


2
小心使用 escape(),它属于附录 B,这意味着它不被弃用,但会产生意外的副作用。请阅读更多详细信息,访问 MDN - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接