在包含反斜杠的字符串中转义反斜杠
Escaping backslash in a string containing backslash
我有一个包含 I\u2019m
的字符串(反斜杠未转义)
var myString = 'I\u2019m'; // I\u2019m
但是我需要一个 'escape backslashes' 那个字符串的函数,所以我正在寻找的函数将 return 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
decodeURIComponent(JSON.parse('"I\u2019m"'));
或多个
'I\\u2019m'.split('\').join().replace(/,/g,'');
'I\u2019m'.split('\').join().replace(/,/g,'');
这里的反斜杠不是真正的问题 - 真正的问题是 code 和 data.[=22= 之间的区别]
\uXXXX
是 JavaScript 语法,用于在文本文字中写入字符的 Unicode 代码点。当 JavaScript 解析器解释此 code.
时,它会被替换为实际字符
现在您有一个已经包含值 I\u2019m
的变量 - 即 data。这不会被解析为 JavaScript,因此它确实表示文字字符 I\u2019m
,而不是 I’m
。 eval
可以“修复”这个问题,因为缺少的将其解释为代码的步骤正是 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
想要后者。
看起来除了 eval 别无他法(JSON.parse 不喜欢字符串中的新行)
注意:如果函数有尾部反斜杠
,则该函数将 return 为 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;
}
}
我有一个包含 I\u2019m
的字符串(反斜杠未转义)
var myString = 'I\u2019m'; // I\u2019m
但是我需要一个 'escape backslashes' 那个字符串的函数,所以我正在寻找的函数将 return 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
decodeURIComponent(JSON.parse('"I\u2019m"'));
或多个
'I\\u2019m'.split('\').join().replace(/,/g,'');
'I\u2019m'.split('\').join().replace(/,/g,'');
这里的反斜杠不是真正的问题 - 真正的问题是 code 和 data.[=22= 之间的区别]
\uXXXX
是 JavaScript 语法,用于在文本文字中写入字符的 Unicode 代码点。当 JavaScript 解析器解释此 code.
现在您有一个已经包含值 I\u2019m
的变量 - 即 data。这不会被解析为 JavaScript,因此它确实表示文字字符 I\u2019m
,而不是 I’m
。 eval
可以“修复”这个问题,因为缺少的将其解释为代码的步骤正是 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
想要后者。
看起来除了 eval 别无他法(JSON.parse 不喜欢字符串中的新行)
注意:如果函数有尾部反斜杠
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;
}
}