2009-05-20 9 views
6

J'essaie d'obtenir un texte de lien en utilisant regex. il y a peut-être plusieurs liens qui peuvent correspondre au modèle et je veux obtenir le plus éloigné jusqu'au 4ème. Voici mon code JS:Expressions régulières Javascript - exec boucle infinie

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

Le problème est que ce code entre boucle infinie sur IE (fonctionne bien sur FF), bien que le modèle existe. Toute aide est appréciée.

+0

Ce code réellement utilisé pour travailler jusqu'à FF3.6, parce que le même objet RegExp a été réutilisé à chaque itération (conformément à ES3). Mais alors ES3 a été remplacé par ES5, qui a changé la façon dont les littéraux RegExp sont traités: "Les expressions littérales régulières retournent maintenant un objet unique chaque fois que le littéral est évalué." Rendre efficacement le drapeau 'g' inutile dans votre cas. http://es5.github.com/#E Encore une fois, IE était en avance sur son temps. – Robert

Répondre

8

RegExp.exec, je crois, fait usage de la propriété lastIndex et modifie sans cesse à faire des choses comme « groupe mondial capture » possible; pour que cela fonctionne, vous devez avoir une seule expression régulière. À l'heure actuelle vous créez un nouveau à chaque itération il ne fonctionnera pas ...

Essayez ceci:

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

Cela fonctionne en fait sur Firefox, Chrome, Opera et Safari, si vous utilisez un littéral regexp dans l'instruction while. IE semble être celui qui se comporte différemment. Cela ne veut pas dire que ce que fait IE est faux ... –

+0

@Ates, je pense que le comportement est dû au fait que les expressions régulières littérales sont "mises en cache" en interne .. alors quand vous en réutilisez une, vous êtes juste référençant le même objet regex. – James

+2

@AtesGoral, Dans ES5, cela ne fonctionne plus. – Robert

Questions connexes