2009-05-20 53 views
6

Regex kullanarak bir bağlantı metni almaya çalışıyorum. Desenle eşleşebilecek çeşitli bağlantılar var ve 4.e kadar en uzak olanı almak istiyorum.Javascript normal ifadeler - exec sonsuz döngü

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

sorun desen var, ancak bu kod, IE üzerinde sonsuz döngü (iyi FF çalışır) girer olmasıdır: İşte benim JS kodudur. Herhangi bir yardım takdir edilir.

+0

aslında FF3.6 kadar çalışırdı Bu kod, aynı RegExp nesne çünkü her yinelemede tekrar kullanılmıştır (ES3 ile uyumlu). Fakat sonra ES3, RegExp edebi'lerinin ele alınış biçimini değiştiren ES5 ile değiştirildi: "Düzenli ifade değişmezleri, literal değerlendirildiğinde her zaman benzersiz bir nesne döndürüyor." Durumunuzda 'g 'bayrağını etkin olmayan şekilde render etmek. http://es5.github.com/#E Yine, IE zamanının önünde idi. – Robert

cevap

8

RegExp.exec, sanırım, lastIndex mülkiyet yararlanır ve sürekli onu "küresel yakalayan grubun" mümkün gibi şeyler yapmak için değiştirir; Çalışmak için tek bir düzenli ifadeye sahip olmanız gerekir. Şu anda Deneyin yeni işe yaramaz böylece her değişiklikte birini ...

oluştururken bu:

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

Aslında while ifadesinde bir regexp literal kullanırsanız, Firefox, Chrome, Opera ve Safari'de çalışır. IE farklı davranan biri gibi görünüyor. Bu, IE'nin yaptıklarının yanlış olduğunu söylememek ... –

+0

@Ates, bence bu davranış, düzenli normal ifadelerin dahili olarak "önbelleğe alınmış" olduğu gerçeğinden kaynaklanmaktadır. Sadece aynı regex nesnesine başvurmak. – James

+2

@AtesGoral, ES5'te artık çalışmıyor. – Robert