Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] No logro realizar un patrón regular

Estas en el tema de No logro realizar un patrón regular en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 24/01/2013, 09:53
 
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

Etiquetas: regular
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:19.