Foros del Web » Programando para Internet » PHP »

Expresión regular compleja (regex).

Estas en el tema de Expresión regular compleja (regex). en el foro de PHP en Foros del Web. Buenos días compañeros, Ya casi he conseguido la expresión regular que quiero, pero necesito un empujoncillo para la parte que, por lo menos a mí, ...
  #1 (permalink)  
Antiguo 11/03/2015, 04:42
 
Fecha de Ingreso: agosto-2009
Mensajes: 91
Antigüedad: 14 años, 8 meses
Puntos: 2
Expresión regular compleja (regex).

Buenos días compañeros,

Ya casi he conseguido la expresión regular que quiero, pero necesito un empujoncillo para la parte que, por lo menos a mí, me parece más compleja. Os pongo en situación.

Tengo el siguiente código html guardado en un array llamado $filtered. Cada posición del array contiene la misma estructura html pero varían los datos, que a manera de ejemplo son los siguientes:


Código HTML:
<td>26/02/2015</td><td>09:00</td><td>26/02/2015</td><td>12:00</td><td>3</td><td>I1/121</td><td>10074 codification</td><td>103126 Codification, Cooperation and development - 11</td><td>Walter Shelter, Mary; Johnson Smith, Robert; Dickinson Queen, Patty</td><td>without group</td> 

La expresión regular la utilizo para tomar:

1 - Los valores de mes (26/02/2015). Con ellos hago una comprobación y si es >07 muestro un "1" y si es <=7 un "2". HECHO!


2 - El código de la tercera columna, formado por código-precódigo (103126-11). Simplemente lo guardo. HECHO!

3 - El primer apellido de todas las personas que están separadas por ";" en la penúltima columna.

Y en el apartado 3 está el problema, no consigo coger más que el primer apellido de la primera persona cuando lo que busco es coger el primer apellido de todas las personas que hay en esa columna.


Aquí el código del regex:
Código PHP:
Ver original
  1. $nodup_filtertoexec = preg_match('/\d{2}\/(\d{2})\/\d{4}.*?\d+\s.*?(\d+)\s.*?-\s(\d+).*?(?:.*?<td>){1}([a-zA-ZñÑ]+).*/m', $filtered, $matches);

Y aquí lo que quiero mostrar por pantalla:

2 103126-11 Walter Johnson Dickinson



Para facilitároslo visualmente podéis ver el código y los valores tomados hasta el momento marcados con colores en:

https://regex101.com/r/oQ1fJ1/2

Muchas gracias de antemano por vuestro tiempo y ayuda!!
  #2 (permalink)  
Antiguo 11/03/2015, 07:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresión regular compleja (regex).

El segmento que comentas es más complejo y una expresión regulare no es suficiente, al menos no sin estudiar a fondo y diseñarla, pero es lleva tiempo y esfuerzo.

Ahora, lo que si puedes hacer es extraer todos los nombres con apellidos y luego con funciones simples de texto normalizas los valores.

Es decir, no estás obligado a resolver tu problema 100% con expresiones regulares.

De hecho, la regla de oro es: si puedes resolver el problema sin usar RegExp entonces no lo uses.

A todo eso, ¿crees que haya sido posible llegar a la misma solución que tienes sin usar RegExp o no viste otra salida?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/03/2015, 07:36
 
Fecha de Ingreso: agosto-2009
Mensajes: 91
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Expresión regular compleja (regex).

Muchas gracias por tu respuesta pateketrueke. Posiblemente pueda solucionarse sin regex, pero realmente no he encontrado otra salida. Ahora mismo acabo de conseguir tomar cada primer apellido, pero tan sólo tres veces. Si tuviera más de tres primeros la expresión regular no funcionaría. Por tanto necesito iterar la expresión: ([a-zA-ZñÑ]+)[^;]+;


E aquí el avance reflejado: https://regex101.com/r/oQ1fJ1/3
  #4 (permalink)  
Antiguo 11/03/2015, 07:40
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Expresión regular compleja (regex).

El tema es que debes decir en RegExp "toma sólo esto, nada más y mira hacia la derecha por cosas similares", eso sería un look-ahead, so deberías revisar una referencia.

http://www.forosdelweb.com/f18/aport...s-pcre-646110/
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 12/03/2015, 02:38
 
Fecha de Ingreso: agosto-2009
Mensajes: 91
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: Expresión regular compleja (regex).

Gracias de nuevo pateketrueke, estoy probando con (?<=;). Es lo único que me falta para terminar la expresión. A ver si se enciende la bombilla!

EDITO: Después de un par de horas machacándolo, nada de nada. He intentado también con (?=;).

Sigo intentándolo

Última edición por jurassicboy; 12/03/2015 a las 04:12

Etiquetas: compleja, html, 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 05:25.