2012-01-07 45 views
8

Tôi muốn nhận URL của tất cả các hình ảnh trong văn bản nhiều dòng (bất kể nó chứa gì).JavaScript RegExp: kiểm tra và thực hiện

Đây là mã của tôi:

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

Nếu str bằng "http://example.dom.com/-6/x_5eb0916a.jpg", testResult bằng đúng nhưng kết quảnull. Tại sao? Bạn có giúp tôi giải quyết vấn đề này không?

+0

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. –

+1

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

Trả lời

7

Đó 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 .execfalse 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"] 
1

Bạn thử này,

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

Giải pháp cho vấn đề này là chỉ cần đặt lastIndex của regex đến số không.

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; 
Các vấn đề liên quan