13

我使用Underscore模板(基於John Resig的Microtemplate),並且每當我嘗試用它替換換行符時,我都會出現奇怪的行爲。舉例來說,如果我有文字是這樣的:下劃線/微模板替換換行符 - 奇怪的行爲

var message = 'Line1\r\n\r\nLine2'; 

我可以適當更換符合BR標籤打破,如果我這樣做:

$('#example1_no_template').html(message.replace(/\r?\n/g, '<br />')); 

但是,如果我嘗試更換下劃線內換行下面的示例代碼模板,我沒有得到任何BR標籤插入:

<script id="template1" type="text/html"> 
    <%= message.replace(/\r?\n/g, '<br />') %> 
</script> 

<script> 
var template1 = _.template($('#template1').html()); 
$('#example1_template').html(template1({ message: message })); 
</script> 

而且奇怪的是,如果我更改模板在我的正則表達式以下內容,然後我得到各種BR標籤的我nserted所有的地方:

<script id="template3" type="text/html"> 
    <%= message.replace(/[\r\n?]/g, '<br /><br />') %> 
</script> 

所有這些行爲都顯示在這個小提琴:http://jsfiddle.net/GHtDY/5/

任何想法是怎麼回事?是否可以更換模板內的換行符?

回答

8

我不知道Underscore的模板解析器是否有一點bug。如果您使用RegExp對象的語法,而不是正則表達式語法:

<script id="template1" type="text/html"> 
    <%= message.replace(new RegExp('\r?\n', 'g'), '<br />') %> 
</script> 

然後你開始的預計業績:http://jsfiddle.net/ambiguous/GHtDY/6/

你的「時髦輸出」例如:

<%= message.replace(/[\r\n?]/g, '<br /><br />') %> 

來臨因爲Underscore將用您的<br>元素替換n。無論如何,該角色類應該與任何單個CR,LF或問號匹配,而這不是你想要做的。

我懷疑Underscore的模板解析器有一些正則表達式文字的問題;您會注意到/\s/g無法按預期方式工作。特別是,在正則表達式文字中,解析轉義序列(如\r\s)似乎有些麻煩。例如,這樣的:按預期message包含了一些數字,但使用new RegExp

<script id="template1" type="text/html"> 
    <%= message.replace(new RegExp('\d', 'g'), '<br /><br />') %> 
</script> 

不按預期方式工作

<script id="template1" type="text/html"> 
    <%= message.replace(/\d/g, '<br /><br />') %> 
</script> 

不起作用。

+0

優秀的解釋。謝謝。 –