2010-04-07 29 views
8

Giả sử chúng tôi có nội dung html này và chúng tôi sẵn sàng nhận Content1, Content2, .. với cụm từ thông dụng.(. *) Thay vì (. *?)

<li>Content1</li> 
<li>Content2</li> 
<li>Content3</li> 
<li>Content4</li> 

Nếu tôi sử dụng dòng dưới đây

preg_match_all('/<li>(.*)<\/li>/', $text, $result); 

tôi sẽ nhận được một mảng với một hàng duy nhất có chứa:

Content1</li> 
<li>Content2</li> 
<li>Content3</li> 
<li>Content4 

Và bằng cách sử dụng mã này:

preg_match_all('/<li>(.*?)<\/li>/', $text, $result); 

tôi sẽ nhận được một mảng với 4 hàng chứa Co ntent1, Content2, ...

Tại sao (. *) không hoạt động kể từ khi nó có nghĩa là match any character zero or more times

Trả lời

19

* trận đấu trong một thời trang tham lam, *? trận đấu trong một thời trang không tham lam.

Điều này có nghĩa là .* sẽ phù hợp như nhiều nhân vật càng tốt, bao gồm tất cả </li><li> cặp trung gian, chỉ dừng lại ở sự xuất hiện cuối cùng của </li>. Mặt khác, .*? sẽ khớp với vài ký tự nhất có thể, dừng ở lần xuất hiện đầu tiên là </li>.

6

Vì chính bản thân nó là một tham lam và ăn nhiều nhất có thể .*? mặt khác không tham lam và ăn ít nhất có thể (dừng lại ở </li> đầu tiên).

3

Xem phần this của bài viết về sự tham lam của cụm từ thông dụng.

+0

cảm ơn, liên kết rất hữu ích – EBAG