2009-05-20 6 views
6

Estoy tratando de obtener un texto de enlace utilizando expresiones regulares. posiblemente hay varios enlaces que pueden coincidir con el patrón y quiero obtener el más lejano hasta el 4to. Aquí está mi código JS:Expresiones regulares de Javascript - ciclo infinito del ejecutivo

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

El problema es que el código entra en un bucle infinito en IE (funciona bien en FF), aunque existe el patrón. Cualquier ayuda es apreciada.

+0

Este código utilizado realmente para trabajar hasta FF3.6, debido a que el mismo objeto RegExp ha sido reutilizado en cada iteración (de acuerdo con ES3). Pero luego ES3 fue reemplazado por ES5, que cambió la forma en que se manejan los literales RegExp: "Los literales de expresiones regulares ahora devuelven un objeto único cada vez que se evalúa el literal". Efectivamente, hacer que la bandera 'g' sea inútil en su caso. http://es5.github.com/#E Nuevamente, IE estaba adelantado a su tiempo. – Robert

Respuesta

8

RegExp.exec, creo, hace uso de la propiedad lastIndex y continuamente lo modifica para hacer cosas como "grupo global capturar" posible; para que funcione, necesitas tener una sola expresión regular. Actualmente se está creando una nueva en cada iteración por lo que no va a funcionar ...

Prueba esto:

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

En realidad funciona en Firefox, Chrome, Opera y Safari, si usas un literal regexp dentro de la instrucción while. IE parece ser el que se comporta de manera diferente. Esto no quiere decir que lo que está haciendo IE sea incorrecto ... –

+0

@Ates, creo que ese comportamiento se debe al hecho de que las expresiones regulares literales se "almacenan en caché" internamente ... así que cuando reutilizas una, estás simplemente haciendo referencia al mismo objeto regex. – James

+2

@AtesGoral, en ES5 ya no funciona. – Robert

Cuestiones relacionadas