Экранирование обратной косой черты в строке, содержащей обратную косую черту - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть строка, содержащая 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)

EDIT: Я не спрашивал, что я имел в виду с самого начала. Это относится не только к символам Юникода, но и ко всем символам обратной косой черты, включая \n

Ответы [ 3 ]

0 голосов
/ 15 апреля 2019

Обратная косая черта здесь не является реальной проблемой - настоящая проблема заключается в разнице между кодом и данными .

\uXXXX - это синтаксис JavaScript для записикод Unicode символа в текстовом литерале.Он заменяется реальным символом, когда синтаксический анализатор JavaScript интерпретирует этот код .

Теперь у вас есть переменная, которая уже содержит значение I\u2019m - это data .Это не анализируется как JavaScript, поэтому оно означает буквальные символы I\u2019m, а не I’m.eval может «исправить» это, потому что пропущенный шаг интерпретации этого как кода - это просто то, что делает eval .

Если вы не хотите использовать eval (и тем самым приглашаете всехпотенциальные риски, которые влекут за собой, если входные данные не полностью находятся под вашим контролем), тогда вы можете анализировать эти числовые значения из строки с помощью регулярных выражений, а затем использовать String.formCharCode для создания фактического символа Юникода из заданной кодовой точки:

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 голосов
/ 15 апреля 2019

Похоже, нет другого пути, кроме 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;
    }
}
0 голосов
/ 15 апреля 2019
decodeURIComponent(JSON.parse('"I\\u2019m"')); 

ИЛИ для нескольких

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