我有一个看起来像这样的对象:
var obj = {
a: "text",
b: "text 2",
c: "text 3",
...
}
我有一堆看起来像这样的字符串:
var stringA = "http://{{a}}.something.com/",
stringB = "http://something.{{b}}.com/",
stringC = "http://something.com/{{c}}";
我希望通过{{(\w)}}
替换obj
,并检查它是否具有每个字符串的匹配值,但我确信有更好更快的方法
有什么想法吗?
答案 0 :(得分:6)
supplant
的函数,几乎完全符合您的要求。我稍微修改了这个函数以匹配你的双花括号 -
if (typeof String.prototype.supplant !== 'function') {
String.prototype.supplant = function (o) {
return this.replace(/{{([^{}]*)}}/g, function (a, b) {
var r = o[b];
return typeof r === 'string' ? r : a;
});
};
}
var obj = {
a: "text",
b: "text 2",
c: "text 3"
}
var stringA = "http://{{a}}.something.com/",
stringB = "http://something.{{b}}.com/",
stringC = "http://something.com/{{c}}";
alert(stringA.supplant(obj));
答案 1 :(得分:2)
var arr = /(.*){{(\w)}}(.*)/.exec(stringA);
arr[2] = obj[arr[2]];
arr.shift(); // remove full string at start
var newString = arr.join("");
或者使用其中一个.replace
解决方案,这些解决方案更优雅。
答案 2 :(得分:1)
这应该这样做:
function format(str, values) {
return str.replace(/{{(\w)}}/g, function(match, name) {
return values[name] || match;
});
}
它只是查找对象是否具有捕获名称的属性。如果没有,没有任何东西被替换。
用法:
var str = format(stringA, obj);