我正在尝试创建一个服务,在发出http请求后发送电子邮件。我在文档的文本中定义了几个变量,类似于#FIRSTNAME
#LASTNAME
等等,甚至在我希望将这些变量替换为帖子收到的信息后(即动态而非先前已知的变量)
我使用的当前方法涉及
的正则表达式方法matcha = /#FIRSTNAME/
matchb = /#LASTNAME/
但是在这两封电子邮件之后,我有一个很长的代码字符串,如下所示:
let outgoingEmail = data.replace(matcha, vara).replace(matchb, varb)
是否有更简洁的方法来替换多场比赛,或者我必须将所有比赛链接在一起?
有两个,我想这是可以容忍的,但我想替换很多,我想知道电子邮件模板服务通常如何处理这个问题。
答案 0 :(得分:2)
创建一个对象来存储针及其替换。使用Object.keys()
获取对象和RegExp
构造函数中的所有键,在键中创建一个带有OR |
的正则表达式。
然后使用带有函数的String#replace
将针替换为来自对象的值。
var replacements = {
'#FIRSTNAME': 'Tushar',
'#LASTNAME': 'Secret'
...
};
var regex = new RegExp(Object.keys(replacements).join('|'), 'g');
// Use `i` flag to match case-insensitively
data.replace(regex, function(m) {
return replacements[m] || m;
});
注意:如果要查找的字符串包含正则表达式中具有特殊含义的字符,则需要在从字符串创建正则表达式之前对其进行转义。
答案 1 :(得分:1)
如果将.replace
与回调函数一起使用,则可以非常轻松地创建基本模板引擎,并提供具有变量名称的对象。
var data = '\n' +
'firstname: #FIRSTNAME\n' +
'lastname: #LASTNAME\n' +
'\n';
var replace = {
FIRSTNAME: 'John',
LASTNAME: 'Smith'
};
var message = data.replace(/#([A-Z]+)/g, function(all, word) {
return replace[word];
});
console.log(message);

我使用的正则表达式将匹配任何#
&s;后跟全部大写字母。您可以根据需要进行调整。