Joh*_*ika 13 javascript regex templates underscore.js underscore.js-templating
我正在使用Underscore模板(基于John Resig的Microtemplate),每当我尝试更换其中的换行符时,我都会遇到奇怪的行为.例如,如果我有这样的文字:
var message = 'Line1\r\n\r\nLine2';
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我可以用br标签正确替换换行符:
$('#example1_no_template').html(message.replace(/\r?\n/g, '<br />'));
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试用下面的示例代码替换Underscore模板中的换行符,我不会插入任何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>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将模板中的正则表达式更改为以下内容,那么我会在各处插入各种br标签:
<script id="template3" type="text/html">
<%= message.replace(/[\r\n?]/g, '<br /><br />') %>
</script>
Run Code Online (Sandbox Code Playgroud)
所有这些行为都显示在这个小提琴中:http://jsfiddle.net/GHtDY/5/
知道发生了什么事吗?是否可以替换模板中的换行符?
我想知道Underscore的模板解析器是否在某处有一点bug.如果您使用RegExp对象语法而不是正则表达式文字语法:
<script id="template1" type="text/html">
<%= message.replace(new RegExp('\r?\n', 'g'), '<br />') %>
</script>
Run Code Online (Sandbox Code Playgroud)
然后你开始得到预期的结果:http://jsfiddle.net/ambiguous/GHtDY/6/
你的"时髦输出"例子:
<%= message.replace(/[\r\n?]/g, '<br /><br />') %>
Run Code Online (Sandbox Code Playgroud)
因为Underscore正在用你的元素取代n,所以时髦了<br>.无论如何,该角色类应该匹配任何单个CR,LF或问号,而这不是你想要做的事情.
我怀疑Underscore的模板解析器在某些正则表达式文字中存在一些问题; 你会发现/\s/g它也没有按预期工作.特别是,它似乎有一些麻烦解析转义序列,如\r与\s内部正则表达式文字.例如,这个:
<script id="template1" type="text/html">
<%= message.replace(/\d/g, '<br /><br />') %>
</script>
Run Code Online (Sandbox Code Playgroud)
当message包含一些数字但使用时,不能按预期工作new RegExp
<script id="template1" type="text/html">
<%= message.replace(new RegExp('\d', 'g'), '<br /><br />') %>
</script>
Run Code Online (Sandbox Code Playgroud)
确实按预期工作.
| 归档时间: |
|
| 查看次数: |
4842 次 |
| 最近记录: |