如何使用JavaScript将字符串中的双引号替换为转义字符双引号?

47
假设我有一个字符串变量(var str)如下-

伙计,他完全说过“你真棒!”

现在如果我想让它看起来像下面这样-

伙计,他完全说过“你真棒!”

我该如何使用JavaScript的replace()函数完成此操作? str.replace("\"","\\"");效果不太好。 它会给出未终止的字符串文本错误。
现在,如果上述句子要存储在SQL数据库中,比如MySQL作为LONGTEXT(或任何其他VARCHAR-ish)数据类型,我还需要执行什么其他字符串优化操作?
引号和逗号对查询字符串并不友好。 我希望能得到一些关于此事的建议。
4个回答

78
您需要使用全局正则表达式来完成此操作。可以尝试以下方式:
str.replace(/"/g, '\\"');

请查看在JavaScript中使用正则表达式中的替换函数的正则表达式语法及选项。


为什么需要正则表达式来替换字面字符串? - Peter Mortensen
@PeterMortensen,例如在使用GraphQL时,可能是必要的,因为其标量通常仅包括ID、String、Int、Float、Boolean等,因此没有Maps等。使用这种方法,将对象保存为字符串很容易,在某些情况下非常有用。如果没有正则表达式,JSON将被转义,查询将失败。 - Christoffer
这解决了问题。谢谢。 - Bishal Paudel
我在使用GraphQL的Apollo客户端时遇到了双引号问题,上述代码在这种情况下无法正常工作。 - Wayne Smallman
@WayneSmallman你想在Stack Overflow上发布一些详细问题吗?随意在这里链接。 - Willem D'Haeseleer
嗨@WillemD'Haeseleer,事实证明我在应用程序的其他地方有代码:JSON.stringify(string).replace(/"(\w+)"\s*:/g, '$1:') - Wayne Smallman

9

试试这个:

str.replace("\"", "\\\""); // (Escape backslashes and embedded double-quotes)

或者,使用单引号来引用您的搜索和替换字符串:

str.replace('"', '\\"');   // (Still need to escape the backslash)

正如helmus所指出的那样,如果传递给.replace()方法的第一个参数是一个字符串,它只会替换第一次出现的结果。如果想要全局替换,你需要传递一个带有g(全局)标志的正则表达式:

str.replace(/"/g, "\\\"");
// or
str.replace(/"/g, '\\"');

但是为什么你要用JavaScript来做这个呢?如果你有一个字符串字面量,使用这些转义字符是可以的,比如:

var str = "Dude, he totally said that \"You Rock!\"";

但这只在字符串字面量中是必需的。也就是说,如果您的JavaScript变量设置为用户在表单字段中键入的值,则不需要进行转义。

关于在SQL数据库中存储此类字符串的问题,同样地,只有在嵌入字符串字面量到您的SQL语句中时才需要转义字符,记住适用于SQL的转义字符通常与JavaScript不同。您需要在服务器端执行任何与SQL相关的转义。


1
无法正常工作,因为它只会替换第一个双引号。 - Willem D'Haeseleer
@nnnnnn 感谢您提供有关 SQL 查询转义的额外信息。对于我正在处理的测试项目,我决定在将它们作为字符串发送到服务器之前转义任何必须转义的字符。 - Samik Sengupta
你不会从JS向服务器发送SQL查询吧?那将是一个重大的安全问题。(另外,我从未使用过MySQL,但我使用的数据库如SQLServer、DB2和Oracle不需要转义双引号,并且不用反斜杠转义单引号...) - nnnnnn

6

其他答案对大多数字符串都适用,但是您可能会解除转义已经转义的双引号,这可能不是您想要的。

为了正确工作,您需要转义所有反斜杠,然后转义所有双引号,像这样:

var test_str = '"first \\" middle \\" last "';
var result = test_str.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');

根据您需要使用字符串以及其他转义字符的情况,这种方法可能仍存在一些问题,但我认为它在大多数情况下应该可以工作。


1
是的,这是更健壮的解决方案。 - Peter Mortensen

0
var str = 'Dude, he totally said that "You Rock!"';
var var1 = str.replace(/\"/g,"\\\"");
alert(var1);

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