13

アンダースコアテンプレート(John Resigのマイクロテンプレートに基づく)を使用していますが、その中の改行を置き換えようとすると、奇妙な動作が発生します。たとえば、次のようなテキストがある場合:

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/

何が起こっているのか分かりますか?テンプレート内の改行を置き換えることは可能ですか?

4

1 に答える 1

8

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 />') %>

アンダースコアがn<br>要素に置き換えているため、ファンキーになります。とにかく、その文字クラスは単一の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>

期待どおりに機能します。

于 2011-10-07T05:09:49.307 に答える