【问题标题】:JavaScript String.raw to not process substitutions to get the "raw" raw string?JavaScript String.raw 不处理替换以获取“原始”原始字符串?
【发布时间】:2020-02-08 16:33:14
【问题描述】:

我想使用用户提供的字符串作为 JavaScript 函数的参数,因此需要转义所有可能导致脚本中断的字符。

这是用于处理原始 JavaScript 的 WKWebView.evaluateJavaScript() 的 Swift 到 JavaScript 桥接器。

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

字符串可以包含任何内容、换行符、双引号、反引号、Unicode 转义序列、替换等。

目前我使用模板文字和转义:

  • \ 带 \\(单反斜杠和双反斜杠)
  • ${ 与 \${
  • ` 带反斜杠+反引号

我试图让它与 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}

这可能吗?

【问题讨论】:

  • 用户的字符串如何进入Javascript?目前是直接在HTML中写成Javascript吗?
  • 不,String 实际上是一个 Swift API 生成的 JSON 字符串。然后我即时生成一个 JavaScript sn-p 并通过调用 webView.evaluateJavaScript() 将其注入页面,以便解析和评估 JavaScript。
  • 好吧,根本不要使用String.raw。只需对字符串进行 JavaScript 编码(类似于 JSON 对字符串值进行编码)

标签: javascript escaping template-literals


【解决方案1】:

你可以用这个:

/**
 * Prepare multi-line string for inclusion in JavaScript.
 * 
 * Note! New line characters are added because slash (\) at the end of template string would brake template syntax.
 * Starting new line is added for code beauty ;-).
 * 
 * @param {String} text Some string.
 */
prepareTemplateString(text) {
    if (text.search(/[`$]/)>=0) {
        text = text.replace(/([`$])/g, '\\$1');
        return "String.raw`\n"+text+"\n`.replace(/\\\\([`$])/g, '\\$1')";
    }
    return "String.raw`\n"+text+"\n`";
}

但我对此并不满意。似乎String.raw 实际上比标准模板字符串慢。我认为 String.raw 会有一些优化,但它似乎只是模板字符串之上的另一层。

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2019-11-02
    • 2018-12-01
    • 1970-01-01
    • 2012-05-06
    • 2016-06-11
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多