Ver Mensaje Individual
  #8 (permalink)  
Antiguo 11/12/2007, 12:21
Avatar de qwerty_wq
qwerty_wq
 
Fecha de Ingreso: enero-2005
Mensajes: 109
Antigüedad: 19 años, 3 meses
Puntos: 1
Re: Duda con expresiones regulares

Muchísimas gracias, Lanselot, me parece que sin entendernos ambos del todo has logrado darme la pista que resuelve el problema. Dicha pista radica en el modificador U que vuelve a los cuantificadores menos "codiciosos" y tienden a coger el resultado más "pequeño" que cumpla con el patrón:

http://es.php.net/manual/es/referenc....modifiers.php

Y el problema era éste:

Código:
$string = '-----#1#El primer email es [email protected]@1@-----#1#El segundo email es [email protected]@1@-----';
preg_match('/#1#(.*)@1@/', $string, $res);
Si entendemos '-----' por contenido "de relleno" que no es importante, está claro que ahí hay dos etiquetas cuyo contenido quiere leerse. Si ejecutamos el código anterior, $res[1] contendrá lo siguiente:

Cita:
El primer email es [email protected]@1@-----#1#El segundo email es [email protected]
Sin embargo, una solución que podría ser leer el contenido con esta sentencia:

Código:
preg_match('/#1#([^@]*)@1@/', $string, $res);
No sirve para nada, porque hay una arroba dentro del contenido de las dos etiquetas. La clave, por tanto, es hacer a los cuantificadores menos "codiciosos" y que detecten el contenido menos amplio que cumpla con el patrón.

Un saludo y muchísimas gracias por todo

PD: esto del modificador U debería aparecer en la información de preg_match en php.net de forma clara, ya que si queremos hacer un parser XML "casero" (o similar, que es lo que quiero hacer) vamos a necesitarlo de forma irremediable. Además, en muchas aplicaciones nos puede interesar coger el contenido más "pequeño" que cumpla la expresión regular en lugar del más largo. Se me ocurre, por ejemplo, un "traductor" de código phpBB.