JavaScript String.raw不处理替换以获取;生的;粗线?

JavaScript String.raw不处理替换以获取;生的;粗线?,javascript,escaping,template-literals,Javascript,Escaping,Template Literals,我想使用用户提供的字符串作为JavaScript函数的参数,因此需要转义所有可能导致脚本中断的字符 这是一个Swift到JavaScript的桥接器,用于处理原始JavaScript的WKWebView.evaluateJavaScript() window.someObject.method( ... user provided string ... ) 字符串可以包含任何内容、换行符、双引号、反勾号、unicode转义序列、替换等 目前我使用的是一个模板文本和转义: \带\\(单反斜杠和

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

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

window.someObject.method( ... user provided string ... )
字符串可以包含任何内容、换行符、双引号、反勾号、unicode转义序列、替换等

目前我使用的是一个模板文本和转义:

  • \带\\(单反斜杠和双反斜杠)
  • ${with\${
  • `使用反斜杠+反勾号
我试图让它与
String.raw
一起工作,但我不知道如何逃避替换

潜在用户输入:

hello ${1+1}
我希望将该字符串作为JavaScript函数的参数,不处理替换

以下是我尝试过的:

//用户输入为:hello${1+1}
console.log(String.raw`hello${1+1}`)
console.log(String.raw`hello\${1+1}`)//非常接近,但不是很接近
log('I-want:hello${1+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会有一些优化,但它似乎只是模板字符串之上的另一层。

您可以使用以下方法:

/**
 * 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会有一些优化,但它似乎只是模板字符串之上的另一层。

用户的字符串是如何到达Javascript的?它是直接写入HTML中的Javascript吗现在还没有?不,字符串实际上是一个由Swift API生成的JSON字符串。然后我动态生成一个JavaScript片段,并通过调用
webView.evaluateJavaScript()
将其注入页面,以便对JavaScript进行分析和计算。好吧,根本不要使用
String.raw
。只需使用JavaScript对字符串进行编码(类似于JSON编码字符串值)用户的字符串是如何到达Javascript的?它目前是否直接写入HTML中的Javascript?不,该字符串实际上是由Swift API生成的JSON字符串。然后我动态生成一个Javascript片段,并通过调用
webView.evaluateJavaScript()将其注入页面
因此JavaScript被解析和评估。好吧,根本不要使用
String.raw
。只需JavaScript编码字符串(类似于JSON编码字符串值)