如何在JavaScript

时间:2016-12-21 03:39:54

标签: javascript regex replace

我正在尝试创建一个服务,在发出http请求后发送电子邮件。我在文档的文本中定义了几个变量,类似于#FIRSTNAME #LASTNAME等等,甚至在我希望将这些变量替换为帖子收到的信息后(即动态而非先前已知的变量)

我使用的当前方法涉及

的正则表达式方法
matcha = /#FIRSTNAME/
matchb = /#LASTNAME/

但是在这两封电子邮件之后,我有一个很长的代码字符串,如下所示:

 let outgoingEmail = data.replace(matcha, vara).replace(matchb, varb)

是否有更简洁的方法来替换多场比赛,或者我必须将所有比赛链接在一起?

有两个,我想这是可以容忍的,但我想替换很多,我想知道电子​​邮件模板服务通常如何处理这个问题。

2 个答案:

答案 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;后跟全部大写字母。您可以根据需要进行调整。