我有以下情况: 有一些字符串包含一些变量,例如:
var string = '/page/{id}/{title}';
现在,我希望能够使用以下数组中的变量替换{id}和{title}:
var arr = {'id':10, 'title':'test-page'};
我想出了这个小正则表达式:
string.replace ( /{([a-zA-Z0-9]+)}/g , '$1' );
正如预期的那样,只返回这个:
/page/id/title
所以我尝试了这个:
string.replace ( /{([a-zA-Z0-9]+)}/g , arr [ '$1' ] );
但是返回
/page/undefined/undefined
现在,我明白这样的事情可能会有一个循环等等,但是为此有一个单行程会很好。我不习惯JS,所以我希望有一些我不知道的功能或选项可以帮助我解决这个问题:)。
祝你好运!
答案 0 :(得分:4)
尝试这样的事情:
var arr = {'id':10, 'title':'test-page'};
'/page/{id}/{title}'.replace(/\{([\w\d]+?)\}/g, function(a, b) {
return arr[b] || '';
});
如果您经常使用此替换项,我将创建一个String
辅助原型方法。例如:
String.prototype.template = function(data) {
return this.replace(/\{([\w\d]+?)\}/g, function(a, b) {
return data[b] || '';
});
};
并像这样使用它:
'/page/{id}/{title}'.template(arr);
答案 1 :(得分:0)
根据MDN article,
因为我们想进一步 在最终替换之前转换匹配的结果 制作,我们必须使用一个功能。这迫使评估比赛 在
toLowerCase()
方法之前。如果我们试图这样做的话 没有函数的匹配,toLowerCase()
将无效。
(在上面的文字中,将toLowerCase()
替换为“访问对象中的属性”)
然后,您可以使用
function replacer(match, p1, p2, p3/*, ...*/, offset, string){
return arr[p1];
}
var arr = {'id':10, 'title':'test-page'};
'/page/{id}/{title}'.replace(/\{([\w\d]+?)\}/g, replacer);