Подтвердить что ты не робот

Подчеркивание/микрометрика Замена разрывов строк - странное поведение

Я использую шаблон Underscore (который основан на Microtemplate от John Resig), и всякий раз, когда я пытаюсь заменить его внутри, я получаю странное поведение. Например, если у меня есть текст:

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>

Все эти поведения показаны в этой скрипте: http://jsfiddle.net/GHtDY/5/

Любая идея, что происходит? Можно ли заменить разрывы строк внутри шаблона?

4b9b3361

Ответ 1

Интересно, есть ли у парсера шаблонов Underscore какая-то ошибка. Если вместо синтаксиса регулярного выражения используется синтаксис объекта RegExp:

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

тогда вы начинаете получать ожидаемые результаты: http://jsfiddle.net/ambiguous/GHtDY/6/

Пример "funky output":

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

выходит фанки, потому что Underscore заменяет n вашими элементами <br>. В любом случае, этот класс символов должен соответствовать любому одному CR, LF или вопросительному знаку, и это не то, что вы пытаетесь сделать в любом случае.

Я подозреваю, что у парсера шаблонов Underscore есть некоторые проблемы с некоторыми регулярными выражениями; вы заметите, что /\s/g не работает так, как ожидалось. В частности, кажется, что некоторые проблемы анализируют escape-последовательности, такие как \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>

работает как ожидалось.