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"]
Si ha un ')' troppo alla fine della riga 2. Inoltre cos'è 'str'? Non è definito nel tuo codice. –
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