Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/01/2013, 09:53
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
No logro realizar un patrón regular

Expresión regular.

Siempre los estoy intentando evitar porque no los conocía pero hoy me veo con la necesidad y me puse manos a la obra por la mañana primero a leer la documentación disponible y varios tutoriales y aún así no consigo realizar lo que quiero.

Partiendo de este string:
Código PHP:
Ver original
  1. /*Siempre empieza por un caracter seguido de un numero, seguido de moto o urba, luego una fecha, luego un _ para separar y un número más*/
  2. $cadena = 'a623moto20130122_8633.pdf';

Lo que no acabo de entender del todo es... que parte le digo que quiero que me devuelva? Yo pongo un patrón y el busca ese patrón, pero yo quiero que de ese patrón me devuelva una parte en concreto. No se, no entiendo muy bien el sistema. He llegado hasta aquí:

Código PHP:
Ver original
  1. preg_match_all('#.*(moto|urba)([\1-9]*_)#', $cadena, $coincidencias);

Pero no logro lo que quiero. Estoy intentando sacar lo que hay entre moto y _ teniendo en cuenta que antes siempre tiene que poner o moto o urba. Pero no hay manera.

Normalmente uso strlen+strpos+substr pero esta vez lo necesito usar si o si.

Modificando por
Código PHP:
Ver original
  1. preg_match_all('#(moto|urba)([\1-9]*)_#', $fichero, $coincidencias);

Me funciona mejor, me devuelve en uno de los índices del array lo que quiero. Pero por qué me muestra más cosas?

Por último yo entendí que preg_match sería la solución, pero me devuelve moto. ¿Como especifico lo que quiero que me devuelva?
Código PHP:
Ver original
  1. preg_match('#moto|urba([\1-9]*)_#', $fichero, $coincidencias);
Creo que ahí es donde está mi error.

Actualización:
He visto que se pueden dar nombres a los ambitos de los paréntesis así que creo que con una sola preg_match podría sacar todo lo que quiero, el problema es que me sigue devolviendo un array vacío y no se qué hago mal. Aunque voy aprendiendo cosas eso sí. La cosa va así:
Código PHP:
Ver original
  1. $fichero = "a623moto20130122_8633.pdf";
  2. preg_match('/^(?<serie>[a-z]|[A-Z])(?<empresa>moto|urba)(?<fecha>[0-9]+)_(?<clacli>[0-9]+)\.pdf$/i', $fichero, $coincidencias);
  3. var_dump($coincidencias);
  4. //array vacío :(


Solucionado:
Código PHP:
Ver original
  1. preg_match('/(?<serie>[a-z]|[A-Z])(?<factura>\d+)(?<empresa>moto|urba)(?<fecha_factura>\d+)_(?<cliente>\d+)(?<extension>\.pdf)$/', $fichero, $coincidencias);

Buff al final ha salido y aprendí muchísimo de expresiones regulares.

Un saludo.

Última edición por alyciashape; 24/01/2013 a las 11:36