2010-04-07 6 views
8

Supposons que nous ayons ce contenu html, et que nous acceptions Content1, Content2, .. avec une expression régulière.(. *) Au lieu de (. *?)

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

Si j'utilise la ligne ci-dessous

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

je vais obtenir un tableau avec une seule ligne contenant:

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

Et en utilisant ce code:

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

je vais obtenir un tableau avec 4 lignes contenant Co ntent1, Content2, ...

Pourquoi (. *) ne fonctionne pas car cela signifie match any character zero or more times

Répondre

19

* matches de façon avide, *? matches de façon non avide.

Ce que cela signifie est que .* correspondra comme beaucoup caractères que possible, y compris tous les </li><li> intermédiaires paires, arrêtant seulement à la dernière apparition de </li>. D'autre part, .*? correspondra comme quelques caractères que possible, en s'arrêtant à la première occurrence de </li>.

6

Parce que .* lui-même est gourmand et mange autant qu'il le peut (c'est-à-dire jusqu'à la dernière </li>) tout en permettant au motif de correspondre. D'autre part n'est pas gourmand et mange le moins possible (arrêt au premier </li>).

3

Voir la section de l'article this sur la gourmandise des expressions régulières.

+0

merci, lien très utile – EBAG