javascript - 下划线/微模板替换换行符 - 奇怪的行为

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

我正在使用 Underscore 模板(基于 John Resig 的 Microtemplate),每当我尝试替换其中的换行符时,我都会遇到奇怪的行为。例如,如果我有这样的文字:

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

如果我这样做,我可以用 br 标签正确地替换换行符:

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

但是,如果我尝试用下面的示例代码替换 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>

奇怪的是,如果我将模板中的正则表达式更改为以下内容,那么我会在各处插入各种 br 标签:

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

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

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

最佳答案

我想知道 Underscore 的模板解析器是否在某处有一点错误。如果您使用 RegExp 对象语法而不是 regex 文字语法:

<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在正则表达式文字中。例如,这个:

<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>

按预期工作。

关于javascript - 下划线/微模板替换换行符 - 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683149/

相关文章:

javascript - 如何对网页内容进行屏幕截图/加入 2 张图片

javascript - 使用生成器暂停直到 promise 解决

regex - 重写所有 URL

Python - 用于从 CSV 文件中的整行中删除引号的正则表达式

javascript - 删除所有 <td> 都具有特定类的表行的问题

javascript - 如何检查选择选项中的所有值是否与javascript相同?

php - 从数组中替换(添加)区分大小写的单词

c++ - 模板生成一百个C回调函数,编译不慢

amazon-web-services - 无法按所需顺序执行嵌套模板,从而进一步回滚

c++ - 这个 SFINAE 模式有名字吗?