嵌套元素中的文本替换

时间:2013-11-26 18:32:31

标签: javascript jquery html regex json

我的页面上有一个看起来像这样的元素:

<div id="product-123">
    <h3>${Title}</h3>
    <div>
        ${Description}
    </div>
    <div>
        ${Price}
    </div>
</div>

我有一个看起来像这样的JSON对象:

var Product = {
    'Title': 'Potion of Stamina',
    'Description': 'Restores stamina greatly.',
    'Price': '$100.00'
}

我需要用Product.Title替换$ {Title},用Product.Description等替换$ {Description}。

到目前为止,我可以匹配元素中的替换字符串:

$('#product-123').html().match(/\$\{\w*\}/g)
// returns ["${Title}", "${Description}", "${Price}"]

我也可以用简单的东西替换替换字符串:

$('#product-123').html().replace(/\$\{(\w*)\}/g, '$1')
// returns
//"<div id="product-123">
//    <h3>Title</h3>
//    <div>
//        Description
//    </div>
//    <div>
//        Price
//    </div>
//</div>"

但这些都不起作用:

$('#product-123').html().replace(/\$\{(\w*)\}/g, Product[$1])
$('#product-123').html().replace(/\$\{(\w*)\}/g, Product['$1'])
$('#product-123').html().replace(/\$\{(\w*)\}/g, '' + Product[$1])
$('#product-123').html().replace(/\$\{(\w*)\}/g, Product['/$1'])

每个只是用undefined替换替换字符串。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

$('#product-123').html().replace(/\$\{(\w*)\}/g, function($0,$1){return Product[$1];});

当您在字符串外使用匹配项时,需要将它们作为函数参数传递。

答案 1 :(得分:0)

这样做:(http://jsbin.com/EPEyAsa/3/edit

if (!String.prototype.supplant) {
    String.prototype.supplant = function (o) {
        return this.replace(/{([^{}]*)}/g,
            function (a, b) {
                var r = o[b];
                return typeof r === 'string' || typeof r === 'number' ? r : a;
            }
        );
    };
}




var Product = {
    'Title': 'Potion of Stamina',
    'Description': 'Restores stamina greatly.',
    'Price': '$100.00'
}

var t= $("#t").clone().html().supplant(Product);


$("body").append(t);

enter image description here