13

Tôi đang sử dụng mẫu Gạch dưới (dựa trên Microtemplate của John Resig) và bất cứ khi nào tôi cố gắng thay thế ngắt dòng bên trong nó, tôi nhận được các hành vi lạ. Ví dụ, nếu tôi có văn bản như thế này:Gạch dưới/Microtemplate Thay thế ngắt dòng - Hành vi lạ

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

tôi đúng cách có thể thay thế ngắt dòng với các thẻ BR Nếu tôi làm điều này:

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

Tuy nhiên, nếu tôi cố gắng thay ngắt dòng bên trong gạch mẫu với mã ví dụ dưới đây, tôi không nhận được bất kỳ thẻ BR chèn vào:

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

Và kỳ lạ, nếu tôi thay đổi biểu hiện thường xuyên của tôi bên trong mẫu để điều sau đây, sau đó tôi nhận được tất cả các loại thẻ BR i nserted khắp nơi:

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

Tất cả những hành vi này được thể hiện trong fiddle này: http://jsfiddle.net/GHtDY/5/

Bất cứ ý tưởng gì đang xảy ra? Có thể thay thế ngắt dòng bên trong mẫu không?

Trả lời

8

Tôi tự hỏi, nếu trình phân tích cú pháp mẫu của Underscore có một chút lỗi ở đâu đó. Nếu bạn sử dụng cú pháp đối tượng RegExp thay vì cú pháp đen regex:

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

sau đó bạn bắt đầu nhận được các kết quả mong đợi: http://jsfiddle.net/ambiguous/GHtDY/6/

của bạn "sôi nổi đầu ra" dụ:

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

đang đến vui vẻ vì Underscore đang thay thế n bằng các yếu tố <br> của bạn. Dù sao, lớp nhân vật đó được cho là phù hợp với bất kỳ CR, LF hoặc dấu chấm hỏi duy nhất nào và đó không phải là những gì bạn đang cố gắng làm.

Tôi nghi ngờ rằng trình phân tích cú pháp mẫu của Underscore có một số vấn đề với một số chữ regex; bạn sẽ thấy rằng /\s/g không hoạt động như mong đợi. Đặc biệt, có vẻ như có một số sự cố khi phân tích cú pháp các chuỗi thoát như \r\s bên trong một chữ regex. Ví dụ, điều này:

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

không hoạt động như mong đợi khi message chứa một số chữ số nhưng sử dụng new RegExp

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

làm việc như mong đợi.

+0

Giải thích tuyệt vời. Cảm ơn bạn. –