在 JavaScript 中转义字符串

Posted

技术标签:

【中文标题】在 JavaScript 中转义字符串【英文标题】:Escaping Strings in JavaScript 【发布时间】:2010-10-20 17:01:15 【问题描述】:

javascript 是否具有像 phpaddslashes(或 addcslashes)这样的内置函数来为字符串中需要转义的字符添加反斜杠?

例如,这个:

这是一个演示字符串 “单引号”和“双引号”。

...会变成:

这是一个演示字符串 \'单引号\'和 \"双引号\"。

【问题讨论】:

“需要转义”是为了什么目的?转义字符串有很多不同的原因,正确的方法可能因目标而异。 (例如,当涉及 SQL 时,PHP 的 addlashes() 通常是错误的解决方案:更好的解决方案是参数化查询) 我实际上正在开发一个 Apple Dashboard 小部件,我希望在通过“widget.system”在终端命令中使用之前正确转义我的字符串。 @SteveHarrison 这可能不安全。将有办法打破这种情况,实现任意代码执行。 Shell 用它们的输入做一些奇怪的事情。如果您计划传递不受信任的数据,那么避免为system 进行后空翻的唯一方法是使用其他一些允许您传递非转义参数的函数。 下面是@Storm 的回答:Use JSON.stringify。这不是一个很好的选择吗? JavaScript: Escaping Special Characters 【参考方案1】:

你也可以用这个

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));

【讨论】:

小心使用escape(),它在附件B中,这意味着没有被弃用但不受欢迎的副作用。阅读更多MDN【参考方案2】:

http://locutus.io/php/strings/addslashes/

function addslashes( str ) 
    return (str + '').replace(/[\\"']/g, '\\$&').replace(/\u0000/g, '\\0');

【讨论】:

那么答案是“不,没有像 PHP 的 addlashes 这样的内置函数” 好的,我会将此函数添加到我的 [不断增长的] JavaScript 中缺少的函数/方法集合中......谢谢! 你能解释一下'\u0000'替换吗?谢谢。 \u0000 是一个空字符。我不确定为什么需要删除。 如何在添加新字符串之前检查字符串是否包含斜杠【参考方案3】:

Paolo Bergantino 提供的函数的一个变体,直接作用于 String:

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());

编辑:

根据 cmets 中的建议,任何担心 JavaScript 库之间冲突的人可以添加以下代码:

if(!String.prototype.addSlashes)

   String.prototype.addSlashes = function()... 

else
   alert("Warning: String.addSlashes has already been declared elsewhere.");

【讨论】:

值得注意的是,许多不好的做法都认为扩展原生 javascript 对象。 @BenjaminGruenbaum:如果你害怕冲突,你可以在扩展之前添加if(!String.prototype.addSlasches) 这到底有什么帮助?如果你期待一个 addSlashes 函数而你得到另一个函数,那么你最终可能会遇到一个很难找到的错误。如果有冲突最好抛出异常 @BT:addSlashes 函数实际上应该以一种或另一种方式添加斜杠。无论如何,我更新了答案中的代码以反映您的建议。【参考方案4】:

使用 encodeURI()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

转义字符串中几乎所有有问题的字符,以便在 Web 应用程序中使用正确的 JSON 编码和传输。这不是一个完美的验证解决方案,但它抓住了唾手可得的果实。

【讨论】:

【参考方案5】:

你也可以试试这个双引号:

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

【讨论】:

这是一个很好的答案。我很惊讶没有内置的“明显”方法来转义引号,但这确实有效。有什么注意事项吗? 带有字符串的 JSON.stringify() 的结果是一个带有双引号的字符串。它是在评估时将产生与您开始时相同的字符串的字符串。因此 JSON.stringify('my string with "quotes"') 返回字符串:"my string with \"quotes\"",您可以在 JavaScript 中将其输入为 '"my string with \"quotes\""'。 一个缺点是不支持像\x00 这样的东西,而是用更长的\u0000 来表示。 这也捕获了换行符、制表符等,其他答案忽略了这些。并且没有它变成所有可能的特殊字符 taboot 的列表。这是最好的答案。值得注意的是,它只转义 " 而不是 ' 美丽、优雅、高效。用它来调试我正在编写的一些解析器 - 非常有用

以上是关于在 JavaScript 中转义字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 onClick 处理程序内的 JavaScript 代码中转义字符串?

如何在 onClick 处理程序内的 JavaScript 代码中转义字符串?

在 SQL 字符串中转义 & 字符

从php中的字符串中转义特殊字符

在 C# 中转义无效的 XML 字符

需要在 .htaccess 重写规则中转义 # (hash/pound) 字符