(. *) Yerine (. *?)

3 Cevap php

Biz bu html içeriği var ve biz düzenli ifade ile content1, Content2 .. almak isteyen varsayalım.

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

Ben aşağıda hattını kullanıyorsanız

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

i içeren tek bir satır ile bir dizi alacak:

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

Ve bu kodu kullanarak:

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

i content1, Content2 içeren 4 satır ile bir dizi alacak ...

Neden gelir çünkü (. *) Çalışmıyor match any character zero or more times

3 Cevap

* a greedy şekilde eşleşen, *? a non-greedy şekilde eşleşir.

Bu demektir .* [(3) {son olayda sadece durdurma, tüm ara </li><li> çiftleri de dahil olmak üzere mümkün olduğunca many karakter olarak maç olacaktır }]. Öte yandan, .*? </li> ilk geçtiği durdurma, mümkün olduğu few karakter olarak eşleşir.

.* kendisi açgözlü ve çok yiyor gibi can (yani kadar son </li>) hala desen maç için izin verirken. Çünkü .*?, diğer yandan açgözlü değildir ve (ilk durdurma </li>) mümkün olduğunca az yiyor.

Düzenli ifadelerin greedyness yaklaşık this makalenin bölümüne bakın.