如何使用REGEX在JavaScript中替换字符串中的标记

时间:2012-09-19 12:04:03

标签: javascript regex string replace

我有这样的模板“text%variable.key%text”。 variable.key是变量。 我需要将这些变量重命名为“text”+ variable.key +“text”,以使它们有效。

我试过这样的事情:

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval('b');
});

但它也会返回一个字符串。

有人能告诉我怎么做吗?

4 个答案:

答案 0 :(得分:2)

在不使用eval的情况下很容易做到:

function getValue(path) {
    var target = this;
    path.split('.').forEach(function (branch) {
        if (typeof target === "undefined") return;
        target = (typeof target[branch] === "undefined") ? undefined : target[branch];
    });

    return target;
}

如果您想从window开始获取属性,只需拨打getValue("path.to.property")即可。如果要从其他根对象开始,请使用getValue.call(rootObject, "path.to.property")

该函数也可以调整为将根对象作为可选的第一个参数,但这个想法保持不变。

See it in action

重要提示:这不适用于Internet Explorer< 9因为Array.prototype.forEach不存在。你可以用

解决这个问题
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fun /*, thisPointer */) {
        var len = this.length;
        if (typeof fun != "function") throw new TypeError();

        var thisPointer = arguments[1];
        for (var i = 0; i < len; i++) {
            if (i in this) {
                fun.call(thisPointer, this[i], i, this);
            }
        }
    };
}

答案 1 :(得分:1)

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval(b);// remove quote.
});

jsfiddle

答案 2 :(得分:1)

您的代码是正确的,但您需要评估b,而不是'b'

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return eval(b);
});

正如评论中所提到的,使用eval不是要走的路。你可以得到像这样的变量值:

var tpl = "text %variable.key% text";
tpl = tpl.replace(/%(.*?)%/, function(a,b) {
    return window[b];
});

DEMO

答案 3 :(得分:1)

另一个没有eval()的变体适用于简单变量或对象:

var var_name = 'value';

// object
var obj = new Object();
 obj.prop = 'some val';

var tpl = "text %obj.prop% text %var_name% text";
tpl = tpl.replace(/%(.*?)%/gi, function(a,b) {
  var iv = b.split('.');
  return (iv.length == 2) ? window[iv[0]][iv[1]] : window[iv[0]];
});

// test
alert(tpl);