Javascript将$1替换为var

Javascript replace with $1 as var

本文关键字:var 替换 Javascript      更新时间:2023-09-26

我有以下情况:有一个特定的字符串,其中包含一些变量,例如:

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

致以最亲切的问候!

试试这样:

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

根据MDN文章,

因为我们想更进一步在最后的替换之前变换匹配的结果制作时,我们必须使用函数。这将强制对匹配进行评估在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);