miércoles, 4 de mayo de 2011

pensando expresioens regulares para que no exageren en lo que abarcan

Muchas veces pasa que necesitamos obtener un texto que está entre medio de dos cosas que entendemos bien, pero que lamentablemente, alguna parte se repite considerablemente. Por ejemplo:

$a="hola mundo, esto es un planeta, chau mundo";

Este string es bastante simple, y ahora el siguiente regex:

/hol
    (.*)
        mundo
/x

Esto es lo que resultaría (dentro de $1):


"a mundo, esto es un planeta, chau "

(sin las comillas, lo puse para que se vean los espacios)

Por defecto, el * es glotón, esto quiere decir, que va a intentar agarrar lo más posible, o sea, para nuestro caso, el último mundo.

Para evitar esto, y que tengamos algo más simple:

/
     hol(.*?)
              mundo.*
/x

El resultado de esto:

"a "

Que, en la mayoría de los casos, es lo que se intentaba obtener.