如何在无法转义的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$ 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)
。让我措手不及的是 string1
和 string2
都不能 sanitized/stripped 关闭 $&
位,所以我不能甚至在将价格 html 插入模板之前对其进行清理。我能看到它工作的唯一方法是从一开始就将 $
转义为 $$
,由于使用了 Number.toLocaleString()
,这是不可能的。我们总是可以放弃 .toLocaleString()
和硬编码 US$$
作为解决方法,但这并不能真正解决问题本身。
综上所述,我如何清理具有 $&
的字符串,假设我在写入时无法转义它?
您需要将 price
中的任何 $
个字符加倍。
const price = '<strong>US$ 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);
与 this 问题相关,但答案没有 解决我的问题。
后端 (Node.js) 从前端 (React) 接收一些 HTML:
// this is merely an example
const price = '<strong>US$ 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)
。让我措手不及的是 string1
和 string2
都不能 sanitized/stripped 关闭 $&
位,所以我不能甚至在将价格 html 插入模板之前对其进行清理。我能看到它工作的唯一方法是从一开始就将 $
转义为 $$
,由于使用了 Number.toLocaleString()
,这是不可能的。我们总是可以放弃 .toLocaleString()
和硬编码 US$$
作为解决方法,但这并不能真正解决问题本身。
综上所述,我如何清理具有 $&
的字符串,假设我在写入时无法转义它?
您需要将 price
中的任何 $
个字符加倍。
const price = '<strong>US$ 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);