避免在JavaScript中转义特殊字符

7

我的服务器返回值为support\testing。当我在客户端获取这个值时,它可能会被转义为support testing\t会被转义为空格。

如何避免JavaScript中的特殊字符转义?


4
返回"support\\testing"?参见:http://msdn.microsoft.com/en-us/library/ie/2yfce773(v=vs.94).aspx - i_am_jorf
2
你应该在服务器端进行转义,然后再发送到JavaScript。 - stackErr
1
我有点困惑。你是想通过更改服务器来避免反转义,还是在客户端上进行反转义? - Mike Samuel
如果\t被渲染为制表符,那么你不应该得到support<tab>esting吗? - apaderno
有没有办法在 JavaScript 中取消转义?如果服务器返回 \t 并且我将其存储到 JavaScript 变量中,它就会被转义为制表符。我的要求是避免这个操作。 - raky
显示剩余2条评论
5个回答

14

您的服务器需要正确进行字符串转义后输出。

在这种情况下,您希望在输出中使用反斜杠字符;反斜杠是一个特殊字符,因此应该进行转义处理。

反斜杠的转义序列是\\(即两个反斜杠),但您不需要考虑具体的转义代码 - 如果您正在输出JS数据,则应该对整个字符串进行适当的转义处理,通常意味着您应该使用JSON编码。

现今大多数服务器语言都提供JSON编码作为内置功能。您没有说明您的服务器使用的是哪种语言,但例如如果它是用PHP编写的,您应该将字符串输出为json_encode($string)而不是直接输出$string。其他语言也提供类似的功能。这不仅可以保护您免受破损的反斜杠字符的影响,还可以避免其他错误,例如在字符串中放入引号或换行符等未转义的内容,在作为未转义的字符串放入JavaScript代码时同样会导致错误。


考虑到这是一个网页,可能需要对上下文堆栈中的更多内容进行转义。如果是脚本元素内的字符串输出,则需要注意 </script>,因为通常情况下仅对JavaScript字符串进行转义并不能解决这个问题 :9 - Esailija

8
您可以使用标记模板字面量。
var str = (s => s.raw)`support\testing`[0]

匿名箭头函数将作为标签,s.raw 包含原始输入。

非常感谢来自PHP世界的支持,我对眼前的东西一无所知,但是你救了我。 - undefined

3

如果您能够更改服务器端代码,应该在那里添加转义字符:"support\\testing"

这将导致所需的结果。


2
这只是一条注释,不是答案。 - apaderno
@kiamlaluno 这可能看起来像是一条注释,但实际上也是一个合法的答案,能够返回原始文章作者想要的结果。 - marteljn
2
在这种情况下,您应该扩展它。您所写的内容已经在评论中提到了;用户选择写评论是有充分理由的。我会将其更改为陈述句,因为您似乎实际上是在向OP提问,而不是回答他。 - apaderno

0

您可以进行简单的替换:

str.replace("\t","\\t");

并对需要替换的其他字符执行此操作。


2
str.replace(/\t/g, '\\t'); 可以将字符串中的制表符替换为"\t"。 - Dziad Borowy
6
这也会更改有意设置的标签,它只是把一个问题换成了另一个问题。 - Esailija

-2

最佳解决方案

function valid(f) {            
        debugger;
        var s = "!@#$%^&*()+=-[]\\\';,./{}|\":<>?~";
        str = f.value;
        for (var i = 0; i < str.length; i++) {
           if (s.indexOf(str.charAt(i)) != -1) {
              //alert("The box has special characters. \nThese are not allowed.\n");
              f.value = f.value.replace(str.charAt(i), '');// : null;
              return false;
            }
        }
 }

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