2012-05-30 118 views
1

我试图用新单词替换多个单词,每当我呈现HTML模板时。Javascript正则表达式用新单词替换多个单词

而是通过模板具有循环(这是相当大)三次,以寻找三个不同的话,我想通过模板结合三个字及其替代,只有一次循环。 (另外,显然下面的代码只替换最后一个单词{id},因为它覆盖了其他两个替换尝试)。

 $.get('/templates/list-item.html', function(data) { 
      var template = data, 
       tmp = ''; 

      $.getJSON('conf.json', function(data) { 
      var items = [], 
       list = data.default; 

      for (var item in list) { 
       var name = item.name, 
        value = list[item].value, 
        id = list[item].id; 

       tmp = template.replace('{name}', name); 
       tmp = template.replace('{value}', value); 
       tmp = template.replace('{id}', id); 

       items.push(tmp); 
      } 

      $('<div/>', { 
       html: items.join('') 
      }).appendTo('body'); 
      }); 
     }); 

显然呈现模板不应该与JS来完成,但由于它仅是供内部使用,没有后端可用,但并不需要通过谷歌进行索引,它的罚款暂且。

回答

9

您可以使用回调函数来替换模板变量。考虑到例如:

template = "{foo} and {bar}" 
data = {foo:123, bar:456} 

template.replace(/{(\w+)}/g, function($0, $1) { 
    return data[$1]; 
}); 

我也建议与map()更换循环:

items = $.map(list, function(item) { 
    var data = {name: item.name, value:.... etc } 
    return template.replace(/{(\w+)}/g, function($0, $1) { 
     return data[$1]; 
    }); 
} 

/{(\w+)}/g基本含义如下:

/    - start pattern 
{    - match { literally 
    (   - begin group 1 
     \w  - a "word" character (letter+digit+underscore) 
     +  - repeat once or more 
    )   - end group 1 
}    - match } literally 
/    - end pattern 
g    - match globally, i.e. all occurences 

当回调函数被调用,它将整个匹配作为其第一个参数,将组1的值作为第二个参数。所以当它看到{foobar}时,它会调用callback("{foobar}", "foobar")

+0

太棒了!您是否介意解释(/ {(\ w +)}/g实际上做了什么?非常感谢! – patad

+0

使用$ .map()有什么好处?它比循环更快还是更容易阅读? – patad

+0

'/{(\ w +)} /'是一个[正则表达式](http://www.javascriptkit.com/javatutors/re.shtml)。'map'更容易阅读并且可以防止[闭环](http:/ /stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example)trouble。 – georg

相关问题