2010-04-07 11 views
8

Supponiamo di avere questo contenuto html e siamo disposti a ottenere Content1, Content2, .. con espressione regolare.(. *) Anziché (. *?)

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

Se uso la linea sotto

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

sarò ottenere un array con una singola riga contenente:

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

E utilizzando questo codice:

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

otterrò un array con 4 righe contenenti Co ntent1, Content2, ...

Perché (. *) non funziona perché significa match any character zero or more times

risposta

19

* partite di avido moda, *? partite di non avido moda.

Ciò significa che .* corrisponderà come molti caratteri come possibili, compresi tutti </li><li> accoppiamenti intermedi, fermandosi solo all'ultimo occorrenza di </li>. D'altra parte, .*? corrisponderà come alcuni caratteri il più possibile, fermandosi alla prima occorrenza di </li>.

6

Perché lo standard .* è ingombrante e consuma quanto più è possibile (ovvero fino all'ultimo </li>) pur consentendo al pattern di corrispondere. .*? d'altra parte non è avido e mangia il meno possibile (fermandosi all'inizio </li>).

3

Vedere la sezione dell'articolo this sull'avidità delle espressioni regolari.

+0

grazie, collegamento molto utile – EBAG

Problemi correlati