如何将纯文本转换为JavaScript模板literal实现邮件变量批量替换
方案1:正则替换(最推荐,安全易实现)
直接用正则匹配所有${变量名}格式的占位符,再从csv读取的对象里取对应值替换即可,完全不需要转模板字面量,性能和安全性都更高。
示例代码:
// 从csv读取的单条用户数据示例 const userData = { name: 'John', email: 'john@example.com' }; // 从txt文件读取的原始模板内容 const template = "Hello ${name}, how are you ${name}"; // 替换核心逻辑 const renderedContent = template.replace(/\${(\w+)}/g, (match, key) => { // 找不到对应变量时默认返回原占位符,也可自定义默认值 return userData[key] ?? match; }); console.log(renderedContent); // 输出:Hello John, how are you John
如果变量名支持下划线、连字符等特殊符号,把正则中的\w+调整为[\w-]+即可适配。
方案2:转模板字面量(不推荐,存在代码注入风险)
仅在模板内容完全可控、无外部用户输入的场景下可以使用,推荐用Function构造函数实现,不要用eval:
const userData = { name: 'John' }; const template = "Hello ${name}, how are you ${name}"; const renderTemplate = new Function(...Object.keys(userData), `return \`${template}\``); const renderedContent = renderTemplate(...Object.values(userData));
注意:如果模板支持普通用户上传/编辑,绝对不要用该方案,恶意用户可在模板中插入可执行代码窃取数据或破坏程序运行
优化建议
- 可以提前提取模板中所有占位符,和csv表头做校验,提前提示用户模板变量和csv字段不匹配的问题,避免漏替换
- 如果需要支持多变量(比如
${phone}、${company}),无需修改正则逻辑,只需往userData中添加对应属性即可正常适配
内容的提问来源于stack exchange,提问作者meerhamzadev
相关产品推荐
相关产品推荐

