2012-01-07 8 views
8

Desidero ottenere gli URL di tutte le immagini nel testo multilinea (indipendentemente dal contenuto).RegExp JavaScript: test ed exec

Questo è il mio codice:

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

Se str uguale "http://example.dom.com/-6/x_5eb0916a.jpg", TestResult uguale vero ma risultato è null. Perché? Mi aiuteresti a risolvere questo problema?

+0

Si ha un ')' troppo alla fine della riga 2. Inoltre cos'è 'str'? Non è definito nel tuo codice. –

+1

Potrebbe essere utile aggiungere un '\ /' tra il tuo dominio ed i pattern di estensione del file, per evitare che i sottodomini vengano analizzati altrimenti 'http: // some.png.example.com/home.html' ti darà' http: // some.png' (ammetto che è solo una questione di principio;)). – Matmarbon

risposta

7

Ciò è dovuto al flag g. Se si invertono le due chiamate, si ottengono risultati diversi perché il flag globale imposta pattern.lastIndex e avvia la corrispondenza da tale indice la prossima volta che si chiama .test/.exec. Quando si invertono le chiamate, si otterrebbe un risultato non null per e false per .test.

Con .lastIndex e la bandiera globale, nel tuo caso corrisponde l'URL per .test, e iniziare la ricerca di più URL dopo il primo URL quando si esegue .exec. Non ci sono più URL, quindi riceverai null. Si noti che lastIndex viene quindi reimpostato su 0, quindi chiamare di nuovo .exec funzionerà di nuovo.

In ogni caso, ti sembra di essere alla ricerca di str.match(pattern) invece, che elenca semplicemente tutti gli incontri:

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

Hai provato questo,

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

Soluzione a questo problema è quello di impostare semplicemente lastIndex regex a zero.

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; 
Problemi correlati