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

问题描述 投票:0回答:3

我有一个包含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\u2019m的字符串反向转换为I'm,并且还可以处理是否有额外的反斜杠(A lost \ backslash

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

javascript backslash
3个回答
0
投票

反斜杠不是真正的问题 - 真正的问题是代码和数据之间的区别。

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

现在你有一个包含值I\u2019m的变量 - 即数据。这不会被解析为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想要后者。


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

或多个

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

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.