2010-04-07 8 views
8

Supongamos que tenemos este contenido html, y estamos dispuestos a obtener Content1, Content2, .. con expresión regular.(. *) En lugar de (. *?)

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

Si uso la línea de abajo

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

voy a tener una matriz con una sola fila que contiene:

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

Y mediante el uso de este código:

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

obtendré una matriz con 4 filas que contienen Co ntent1, Content2, ...

Por qué (. *) no está funcionando, ya que significa match any character zero or more times

Respuesta

19

* partidos de una manera codiciosa , *? partidos de una manera no expansivo.

Lo que esto significa es que .* coincidirá como muchos caracteres como sea posible, incluyendo todos los </li><li> pares intermedios, deteniéndose sólo en la última aparición de </li>. Por otro lado, .*? coincidirá como pocos caracteres como sea posible, deteniéndose en la primera aparición de </li>.

6

Debido .* sí es codicioso y se come tanto como se pueda (es decir, hasta el último </li>) al tiempo que permite el patrón de igualar. .*? por otro lado no es codicioso y se come lo menos posible (deteniéndose al principio </li>).

3

Véase la sección del artículo this sobre la codicia de las expresiones regulares.

+0

gracias, enlace muy útil – EBAG