Javascript替换为$ 1作为var

时间:2014-03-09 20:03:45

标签: javascript regex

我有以下情况: 有一些字符串包含一些变量,例如:

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,所以我希望有一些我不知道的功能或选项可以帮助我解决这个问题:)。

祝你好运!

2 个答案:

答案 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);