Đó là vì cờ g
. Nếu bạn đảo ngược hai cuộc gọi, bạn sẽ nhận được các kết quả khác nhau vì cờ toàn cầu đặt pattern.lastIndex
và bắt đầu đối sánh từ chỉ mục đó vào lần tiếp theo bạn gọi .test
/.exec
. Khi đảo ngược các cuộc gọi, bạn sẽ nhận được kết quả không phải là null
cho .exec
và false
cho .test
.
Với .lastIndex
và cờ toàn cầu, trong trường hợp của bạn nó phù hợp với URL cho .test
, và sẽ bắt đầu tìm kiếm thêm URL sau URL đầu tiên khi bạn thực hiện .exec
. Không có thêm URL, vì vậy bạn sẽ nhận được null
. Lưu ý rằng lastIndex
sau đó được đặt lại thành 0
, vì vậy, hãy gọi lại .exec
sẽ hoạt động.
Nhưng dù sao, bạn dường như tìm kiếm str.match(pattern)
thay vào đó, mà chỉ đơn giản liệt kê tất cả các trận đấu:
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"]
Bạn có một ')' quá nhiều ở cuối dòng 2. Ngoài ra 'str' là gì? Nó không được xác định trong mã của bạn. –
Có thể hữu ích khi thêm một '\ /' giữa tên miền của bạn và các mẫu tiện ích mở rộng tệp, để ngăn không cho phân tách tên miền phụ, nếu không 'http: // some.png.example.com/home.html' sẽ cung cấp cho bạn' http: // some.png' (Tôi thừa nhận nó chỉ là vấn đề nguyên tắc;)). – Matmarbon