在包含反斜杠的字符串中转义反斜杠

时间:2019-04-15 13:58:08

标签: javascript backslash

我有一个包含I\u2019m的字符串(没有反斜杠)

var myString = 'I\\u2019m'; // I\u2019m

但是随后我需要一个“转义反斜杠”该字符串的函数,因此我要查找的函数将返回I'm

backslashString(myString); // I'm

我尝试使用eval:

function backslashString(input){
   input = input.replace(/'/g, "\\'"); // Replace ' with \' that's going to mess up eval
   return eval(`'${input}'`);
}

但是有适当的方法吗?我正在寻找一个将包含I\u2019mI'm的字符串转义反斜线的函数,并且还处理是否存在额外的反斜杠(A lost \ backslash

编辑: 我从一开始就没有问过我的意思。这不仅适用于unicode字符,还适用于所有反斜杠字符,包括\n

3 个答案:

答案 0 :(得分:0)

decodeURIComponent(JSON.parse('"I\\u2019m"')); 

或多个

'I\\\u2019m'.split('\\').join().replace(/,/g,'');
'I\u2019m'.split('\\').join().replace(/,/g,'');

答案 1 :(得分:0)

这里的反斜杠不是真正的问题-真正的问题是 code data 之间的区别。

\uXXXX是JavaScript语法,用于在文本文字中编写字符的Unicode代码点。当JavaScript解析器解释此 code 时,它将替换为实际字符。

现在您有了一个变量,该变量已经包含值I\u2019m-即 data 。这不会被解析为JavaScript,因此它的确意味着文字字符I\u2019m,而不是I’meval可以“解决”这一问题,因为缺少将其解释为代码的步骤仅仅是eval 要做的

如果您不想使用eval(因此,如果输入数据不受您的完全控制,则会引发所有潜在的风险),则可以使用正则表达式解析字符串中的那些数值,然后使用String.formCharCode从给定的代码点创建实际的Unicode字符:

var myString = 'I\\u2019m and I\\u2018m';

var myNewString = myString.replace(/\\u([0-9]+)/g, function(m, n) {
  return String.fromCharCode(parseInt(n, 16)) }
);

console.log(myNewString)

/\\u([0-9]+)/g-匹配此\uXXXX格式(X =数字)的正则表达式,g修饰符替换所有匹配项,而不是在第一个匹配项后停止。

parseInt(n, 16)-首先将十六进制值转换为十进制数,因为String.fromCharCode想要后者。

答案 2 :(得分:0)

看起来除了eval之外别无其他方法(JSON.parse不喜欢字符串中的新行)
注意:如果该函数带有反斜杠,则会返回false

function backslashString(input){
    input = input.replace(/`/g, '\\`'); // Escape quotes for input to eval
    try{
        return eval('`'+input+'`');
    }catch(e){ // Will return false if input has errors in backslashing
        return false;
    }
}