JavaScript String.raw, чтобы не обрабатывать подстановки для получения «сырой» необработанной строки? - PullRequest
0 голосов
/ 11 октября 2019

Я хотел бы использовать предоставленную пользователем строку в качестве аргумента для функции JavaScript и, следовательно, должен экранировать все символы, которые могут привести к разрыву скрипта.

Это для моста Swift to JavaScript, который должен бытьиспользуется с WKWebView.evaluateJavaScript(), который обрабатывает необработанный JavaScript.

window.someObject.method( ... user provided string ... )

Строка может содержать все, что угодно, разрывы строк, двойные кавычки, обратные метки, последовательность перехода из Юникода, подстановки и т. д.

В настоящее время я используюшаблонный литерал и escape:

  • \ с \\ (одинарный обратный слеш с двойной обратной косой чертой)
  • $ {с \ $ {
  • `с обратной косой чертой + обратная косая черта

Я пытаюсь заставить это работать с String.raw, но я не могу понять, как избежать замен.

Потенциальный ввод пользователя:

hello ${1+1}

Я хочу, чтобы эта точная строка была аргументом для моей функции JavaScript, без обработок.

Вот что я попробовал:

// User input is: hello ${1+1}
console.log(String.raw`hello ${1+1}`)
console.log(String.raw`hello \${1+1}`) // So close, but not quite

console.log('I want: hello ${1+1}')

Я хочу вот что:

window.someObject.method( String.raw`hello ${1+1}` ) → hello ${1+1}

Возможно ли это вообще?

1 Ответ

0 голосов
/ 11 октября 2019

Как насчет только строки шаблона?

Этот фрагмент поможет вам в дальнейшем (так: это то, что вы имеете в виду)?

Может быть, Аксель Раушмайерс превосходная глава о строках шаблонов полезна.

const functionString = String.raw`function testFn() {
  const x = 25;
  const y = \`Hithere \${x}\`;
  console.log(\`hello \${1+1} you, y = \${y}\`);
}`
.replace(/\\\$/g, "\$")
.replace(/\\`/g, "`");

console.log(functionString);

eval(functionString);

testFn();
...