如何在无法转义的JS字符串中sanitize/replace $&(美元+符号)?

How to sanitize/replace $& (dollar + ampersand) in a JS string that cannot be escaped?

this 问题相关,但答案没有 解决我的问题。

后端 (Node.js) 从前端 (React) 接收一些 HTML:

// this is merely an example
const price = '<strong>US$&nbsp;0.99</strong>';

货币格式取自Number.prototype.toLocaleString()。看到这个 - $&?我们稍后再谈。

在下面的代码中,#orderPrice# 将替换为产品的价格 HTML 并且字符串将通过来自模板的电子邮件发送:

const template = `Your order has a total price of #orderPrice#.`.

const email = template.replace('#orderPrice#', price);

一切都很好,但事实并非如此。正如 here 和上述 SO 问题中所见,$& 在替换字符串时具有特殊含义 - 它插入匹配的字符串,尽管被认为是非标准的。

假设我们有 string1.replace(/pattern/g, string2)。让我措手不及的是 string1string2 都不能 sanitized/stripped 关闭 $& 位,所以我不能甚至在将价格 html 插入模板之前对其进行清理。我能看到它工作的唯一方法是从一开始就将 $ 转义为 $$,由于使用了 Number.toLocaleString(),这是不可能的。我们总是可以放弃 .toLocaleString() 和硬编码 US$$ 作为解决方法,但这并不能真正解决问题本身。

综上所述,我如何清理具有 $& 的字符串,假设我在写入时无法转义它?

您需要将 price 中的任何 $ 个字符加倍。

const price = '<strong>US$&nbsp;0.99</strong>';
const template = `Your order has a total price of #orderPrice#.`;
const email = template.replace('#orderPrice#', price.replace(/$/g, '$$$$'));
console.log(email);

这个有效:

const email = template.replace('#orderPrice#', () => price);