2009-05-20 46 views
6

Tôi đang cố gắng lấy văn bản liên kết bằng regex. có thể có một số liên kết có thể khớp với mẫu và tôi muốn có một liên kết xa nhất cho đến ngày thứ 4. Đây là mã JS của tôi:Biểu thức chính quy Javascript - vòng lặp vô hạn exec

var level=1; 
while (_match = /<a href="http:\/\/www.mysite.com\/x\/(?:.*)>(.*)<\/a>/img.exec(_html)){ 
    if (level < 5) (_anchor_text=_match[1]); 
    level ++; 
} 

Vấn đề là mã này đi vào vòng lặp vô hạn trên IE (hoạt động tốt trên FF), mặc dù mẫu tồn tại. Bất kỳ trợ giúp được đánh giá cao.

+0

Mã này thực sự đã từng làm việc lên đến FF3.6, vì đối tượng RegExp cùng đã được tái sử dụng trong mọi lần lặp (tuân thủ ES3). Nhưng sau đó ES3 đã được thay thế bởi ES5, mà thay đổi cách RegExp literals được xử lý: "Regular literals biểu hiện bây giờ trả về một đối tượng duy nhất mỗi khi chữ được đánh giá." Hiển thị hiệu quả cờ 'g' vô dụng trong trường hợp của bạn. http://es5.github.com/#E Một lần nữa, IE đã đi trước thời đại của nó. – Robert

Trả lời

8

RegExp.exec, tôi tin rằng, làm cho việc sử dụng lastIndex tài sản và tiếp tục chỉnh sửa lại nó để làm những thứ như "tập đoàn toàn cầu chụp" có thể; để nó hoạt động, bạn cần có một biểu thức chính quy duy nhất. Hiện tại bạn đang tạo một cái mới trên mỗi iteration vì vậy nó sẽ không hoạt động ...

Hãy thử điều này:

var level = 1; 
var pattern = /<a href="http:\/\/www.mysite.com\/x\/(?:.*)>(.*)<\/a>/img; 
var _match; 
while (_match = pattern.exec(_html)){ 
    if (level < 5) (_anchor_text=_match[1]); 
    level ++; 
} 
+0

Nó thực sự hoạt động trên Firefox, Chrome, Opera và Safari, nếu bạn sử dụng regexp literal trong câu lệnh while. IE có vẻ là một hành vi khác nhau. Điều này không có nghĩa là IE đang làm sai ... –

+0

@Ates, tôi nghĩ hành vi đó là do thực tế là các biểu thức chính quy theo nghĩa đen được "lưu trong bộ nhớ cache" nội bộ .. vì vậy khi bạn sử dụng lại, bạn chỉ tham chiếu cùng một đối tượng regex. – James

+2

@AtesGoral, Trong ES5 nó không hoạt động nữa. – Robert

Các vấn đề liên quan