2009-07-22 8 views
0

私は2つのプロパティを持つオブジェクトの配列を持っています:キーと値。オブジェクトのキーに対応するプレースホルダを持つテキストブロックがあります。オブジェクトの対応するValueをプレースホルダに置き換え、一致するキーを使用したいとします。JavaScript置換の問題

私は次のコードを持っている:

function LoadReplacementData(replacementData) 
{ 
    var text = $("#textblock").html(); 

    $.each(replacementData, function(index, item) 
    { 
     var expression = new RegExp("\[sub:" + item.Key + "\]", "g"); 
     text = text.replace(expression, item.Value); 
    }); 

    $("#textblock").html(text); 
} 

を私はJavaScriptの下RegExLib.comでパターンをオーバーテストしていると、それが[サブ」の形をしているプレースホルダのすべてのインスタンスに戻ってくる:KeyText ] "。私はキーと値が正しく戻ってくることを保証しました。私は生成されたさまざまな表現をループし、結果のパターンも正確です。

上記のコードは、text = text...の行に "Out of Memory Exception"と表示されます。割り当てを解除しても何も起こりません。

私がこの交換をするのに間違っているところはありますか?

+0

「#textblock」の内部HTMLの大きさはどれくらいですか? – tj111

+0

各イテレータをプレーン・フォー・ループに置き換えてもそれでも問題はありませんか? –

+0

@ tj111 2000文字未満です。 – JamesEggers

答えて

0

私が最初に気がついているのは、バックスラッシュをエスケープしていないということです。

var expression = new RegExp("\\[sub:" + item.Key + "\\]", "g"); 
+0

@EFraim Trueですが、まだJavaScript文字列であり、パターンに変換する前にエスケープする必要があります。 – JamesEggers

+0

文字列のバックスラッシュをエスケープしてパターンに1つのバックスラッシュとして表示されたら、問題が解決されました。 – JamesEggers

+0

そしてあなたは正規表現を使って1つの完全置換を提案しますか? – EFraim

3

メモリエラーを防ぐために結合と分割を使用することはどうですか?正規表現を使用して文字列全体を複数回解析する必要がないため、メモリのオーバーヘッドが大幅に削減されます。

text = text.split("[sub:"+item.Key+"]").join(item.Value)