2009-05-20 24 views
6

Próbuję uzyskać tekst łącza za pomocą wyrażeń regularnych. jest prawdopodobnie kilka linków, które mogą pasować do wzorca i chcę dostać najdalszy do czwartego. Oto mój kod JS:JavaScript wyrażeń regularnych - exec nieskończona pętla

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

Problemem jest to, że ten kod wprowadza nieskończoną pętlę w IE (dobrze działa na FF), chociaż istnieje wzorzec. Każda pomoc jest doceniana.

+0

Kod ten rzeczywiście pracował do FF3.6, ponieważ tego samego obiektu RegExp został ponownie użyty w każdej iteracji (zgodnie z ES3). Ale ES3 zostało zastąpione przez ES5, które zmieniło sposób, w jaki obsługiwane są literały RegExp: "Regularne wyrażenia ekspresji zwracają teraz unikalny obiekt za każdym razem, gdy literał jest oceniany." Skuteczne renderowanie flagi 'g' bezużytecznej w twoim przypadku. http://es5.github.com/#E Znowu IE wyprzedziło swój czas. – Robert

Odpowiedz

8

RegExp.exec, wierzę, sprawia, że ​​korzystanie z nieruchomości lastIndex i nieustannie modyfikuje to, aby takie rzeczy jak „globalnej grupy przechwytywanie” możliwe; aby to działało, musisz mieć pojedyncze wyrażenie regularne. Obecnie jesteś utworzenie nowego na każdej iteracji, więc nie będzie działać ...

Spróbuj tego:

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

To faktycznie działa na Firefox, Chrome, Opera i Safari, jeśli używasz regexp literału w ciągu instrukcji while. IE wydaje się być tym, który zachowuje się inaczej. To nie znaczy, że to, co robi IE, jest złe ... –

+0

@Ates, myślę, że to zachowanie wynika z faktu, że dosłowne wyrazy regularne są "buforowane" wewnętrznie .. więc kiedy ponownie używasz jednego, jesteś po prostu odwołanie do tego samego obiektu regex. – James

+2

@AtesGoral, W ES5 to już nie działa. – Robert

Powiązane problemy