【问题标题】:Underscore / Microtemplate Replace Line Breaks - Strange Behaviour下划线/微模板替换换行符 - 奇怪的行为
【发布时间】:2011-10-07 04:45:57
【问题描述】:

我正在使用 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 标签:

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

所有这些行为都显示在这个小提琴中:http://jsfiddle.net/GHtDY/5/

知道发生了什么吗?是否可以替换模板内的换行符?

【问题讨论】:

    标签: javascript regex templates underscore.js underscore.js-templating


    【解决方案1】:

    我想知道 Underscore 的模板解析器是否在某个地方存在一些错误。如果您使用 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 正在用您的 &lt;br&gt; 元素替换 n。无论如何,该字符类应该匹配任何单个 CR、LF 或问号,而这不是你想要做的。

    我怀疑 Underscore 的模板解析器在某些正则表达式文字方面存在一些问题;您会注意到/\s/g 也没有按预期工作。特别是,在正则表达式文字中解析转义序列(例如 \r\s )似乎有些麻烦。例如,这个:

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

    message 包含一些数字但使用new RegExp 时无法按预期工作

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

    按预期工作。

    【讨论】:

    • 很好的解释。谢谢。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多