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

优秀的解释。谢谢。 –