2009-05-20 15 views
6

私はregexを使用してリンクテキストを取得しようとしています。パターンにマッチする可能性のあるリンクがいくつかありますが、私は4番まで最も遠くに行きたいと思っています。私のJSコードは次のとおりです:JavaScriptの正規表現 - exec無限ループ

パターンは存在しますが、このコードはIE上で無限ループになります(FFでもうまくいきます)。どんな助けもありがとうございます。

+0

実際には同じのRegExpオブジェクトので、FF3.6まで働くために使用されるこのコードをすべての繰り返しで再利用されています(ES3に準拠)。しかし、ES3はES5に置き換えられ、RegExpリテラルの処理方法が変更されました。「正規表現リテラルは、リテラルが評価されるたびに一意のオブジェクトを返すようになりました。効果的に 'g'フラグをあなたの場合に無駄にする。 http://es5.github.com/#E再び、IEはその時代に先んじていた。 – Robert

答えて

8

RegExp.execは、私は信じて、lastIndex性質を利用し、継続的に可能な「グローバルグループの取り込み」のようなものを作ってそれを修正します。それが機能するためには、単一の正規表現が必要です。現在、それは動作しませんので、あなたはすべての反復で新しいものを作成している...

はこのお試しください:

var level = 1; 
var pattern = /<a href="http:\/\/www.mysite.com\/x\/(?:.*)>(.*)<\/a>/img; 
var _match; 
while (_match = pattern.exec(_html)){ 
    if (level < 5) (_anchor_text=_match[1]); 
    level ++; 
} 
+0

while文でregexpリテラルを使用すると、Firefox、Chrome、Opera、Safariで実際に動作します。 IEは異なった振る舞いをしているようです。これは、IEがやっていることが間違っていると言っているわけではありません... –

+0

@Ates、私はその動作がリテラル正規表現が内部的に "キャッシュ"されているという事実によると思います。同じ正規表現オブジェクトを参照するだけです。 – James

+2

@AtesGoral、ES5ではもう動作しません。 – Robert