2012-05-30 172 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

相關問題