2012-01-07 11 views
8

Quiero obtener URLs de todas las imágenes en texto de líneas múltiples (sin importar lo que contenga).JavaScript RegExp: prueba y ejecutivo

Este es mi código:

var pattern = /(http:\/\/\S+\.(?:jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG))/mg; 
var testResult = pattern.test(str)); 
var result = pattern.exec(str); 

Si str es igual"http://example.dom.com/-6/x_5eb0916a.jpg", TestResult es igual a cierto, peroresultado es null. ¿Por qué? ¿Me ayudarías a resolver este problema?

+0

Tiene un '' demasiado al final de la línea 2. ¿Qué es 'str'? No está definido en tu código. –

+1

Podría ser útil agregar un '\ /' entre su dominio y los patrones de extensión de archivo, para evitar que los subdominios se analicen; de lo contrario 'http: // some.png.example.com/home.html' le dará' http: // // some.png' (concedo que es solo una cuestión de principios;)). – Matmarbon

Respuesta

7

Eso es debido a la bandera g. Si invierte las dos llamadas, obtendrá resultados diferentes porque el indicador global establece pattern.lastIndex y comienza a hacer coincidir ese índice la próxima vez que llame al .test/.exec. Cuando la inversión de las llamadas, se obtendría un resultado fuera de null.exec y false para .test.

Con .lastIndex y el indicador global, en su caso, coincide con la dirección URL de .test, y comenzará a buscar más direcciones URL después de la primera URL cuando se ejecuta .exec. No hay más URL, por lo que obtendrá null. Tenga en cuenta que lastIndex se restablece a 0, así que llamar al .exec funcionaría nuevamente.

En cualquier caso, parece ser que estás buscando str.match(pattern) en cambio, que se limita a enumerar todos los partidos:

var str = " test http://example.dom.com/-6/x_5eb0916a.jpg" 
      + " \nfoo http://example2.com/test.png"; 

var pattern = /(http:\/\/\S+\.(?:jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG))/gm; 

str.match(pattern); 
// ["http://example.dom.com/-6/x_5eb0916a.jpg", "http://example2.com/test.png"] 
1

Quizás quiso probar esto,

"http://example.dom.com/-6/x_5eb0916a.jpg".match(pattern) 
1

solución a este problema es establecer simplemente lastIndex de regex a cero

var pattern = /(http:\/\/\S+\.(?:jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG))/mg; 
var testResult = pattern.test(str)); 
pattern.lastIndex=0; 
var result = pattern.exec(str); 
pattern.lastIndex=0; 
Cuestiones relacionadas