Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Cargar datos extraidos con 'RegExpr' en array php

Estas en el tema de Cargar datos extraidos con 'RegExpr' en array php en el foro de PHP en Foros del Web. Hola. Llevo unos dias intentando hacer funcionar esto y no sé como arreglarlo. Os cuento. Uso unas galerías de fotos que guardo en un campo ...
  #1 (permalink)  
Antiguo 17/09/2013, 12:21
 
Fecha de Ingreso: septiembre-2013
Mensajes: 33
Antigüedad: 10 años, 7 meses
Puntos: 4
Cargar datos extraidos con 'RegExpr' en array php

Hola.

Llevo unos dias intentando hacer funcionar esto y no sé como arreglarlo.

Os cuento. Uso unas galerías de fotos que guardo en un campo de una base de datos, de esta forma:

Código:
<a href="http://www.website.com/img.php?image=image1.jpg"><img src="http://www.website.com/img.php?image=image1_min.jpg" style="max-width: 210px; max-height: 230px"></a>

<a href="http://www.website.com/img.php?image=image2.jpg"><img src="http://www.website.com/img.php?image=image2_min.jpg" style="max-width: 210px; max-height: 230px"></a>

<a href="http://www.website.com/img.php?image=imageN.jpg"><img src="http://www.website.com/img.php?image=imageN_min.jpg" style="max-width: 210px; max-height: 230px"></a>
... y así consigo tener recopilado cada galería en un registro diferente de la base de datos en un campo de texto donde la 1ª foto es la portada y el resto son las fotos del album

A la hora de mostrarlas tengo en una pagina php donde muestro la primera foto de cada galería... para ello uso las "expresiones regulares" de forma que pueda separar cada foto en una posición del array y evidentemente la 1ª foto va en la posición 0 del array ( algo así--> $coincidencias[0];)

Después, en esa galería (representada con la 1ª foto, o foto de portada) tengo una cabecera con el título o nombre del album, fecha de inserción, (eso ya está) y añadir el número de fotos que contiene ese album... que supuestamente con count($coincidencias) debería funcionar, pero siempre me da como recuento 1 o 2.

Esto que cuento lo hago de esta forma:
Código PHP:
$patron  "/\<a href(\S*)\s*\S*\s*\S*\s*\S*\s*\S*\s*\S*\/a>/";                
preg_match($patron$cadena$coincidencias); 
donde $patron es la expresión regular; $cadena es la celda de la base de datos que contiene todos los enlaces a extraer y $coincidencias el array donde cargo todos los resultados

A lo que voy... sé que el fallo parece venir de la expresión regular, porque tengo el componente "Regular Expresions Tester" del Firefox y probándo esa expresión regular parece ir bien (eso si, sin el carácter '/' incial y final ya que en php parece que sin esas '/' no funciona y creo que es porque ese testeador parece que trabaja con expresiones regulares para javascript y en php no va exactamente igual).

He de decir que la 1ª imagen si la carga en el 1º resultado del array, pero el 2º resultado del array es solo un fragmento de la segunda url y luego ya no hay mas resultados.

¿qué estoy haciendo mal? ¿hay un patron de RegEx mejor?

*En la seccion de javascript hay un apartado de expresiones regulares pero he puesto esta consulta aquí porque quiero que funcione para php.
  #2 (permalink)  
Antiguo 17/09/2013, 14:13
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Cargar datos extraidos con 'RegExpr' en array php

El patrón RegExp que estás usando además de horrible es redundante y nada específico.

Un patrón bien escrito sería:
Cita:
|<a\s+href[^<>]*>(.+?)</a>|
En sí, tu problema es más de RegExp que de PHP o Javascript, pues RegExp es un lenguaje muy aparte con sus propias reglas y sintaxis, así que debería funcionar también.

Si quieres continuar aprendiendo acerca de RegExp no dudes en visitar el sub-foro de expresiones regulares.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 17/09/2013, 15:58
 
Fecha de Ingreso: septiembre-2013
Mensajes: 33
Antigüedad: 10 años, 7 meses
Puntos: 4
Respuesta: Cargar datos extraidos con 'RegExpr' en array php

Ante todo muchas gracias pateketrueke

Estaba convencido que alguien diría de mi expresión regular...

...lo cierto es que no he trabajado casi con ellas y bueno, busqué unos símbolos comodín que me valiesen para ello y salir al paso rápidamente.

El resultado que obtengo con tu expresión regular es el mismo pero diría que se nota que va mas rápido (no sé, habría que testearlo para ver si es así y seguro que ademas es mas eficiente, a mi al menos me parece que carga mas rápido y mas liviano).

Digo que el resultado es el mismo (o muy similar), pues mira, al hacer un print_r($coincidencias); me sale esto, que es lo mismo que me salía con lo que ya tenía:

Código:
Array
(
    [0] => <a href="http://www.website.com/img.php?image=image1.jpg"><img src="http://www.website.com/img.php?image=image1_min.jpg" style="max-width: 210px; max-height: 230px"></a>
    [1] => <img src="http://www.website.com/img.php?image=image2_min.jpg" style="max-width: 210px; max-height: 230px">
)
Como se puede apreciar, el 1º registro del array está perfecto pero el segundo sale una porción (concretamente sin el codigo correspondiente al enlace)... y ya tercera, cuarta y eNesima imágen no las carga en el array y al menos debería cargar 8 o 9 imágenes.

Esta es la parte B del problema... ahí ya no sé donde está exáctamente el error, si es por la expresión regular o si es por el PHP, también por eso lo metí aquí, en este apartado del foro.

Por si tuviese algo que ver (yo diría que no influye pero...), deciros que tengo esto en medio de un "while", pues esto que hemos visto son las acciones para cargar los datos de 1 galería de fotos, pero yo cargo todas las galerías de fotos de una temática o sección en concreto, de modo que me muestre todos los albumes que tiene esa sección.

Resumiendo un poco, lo hago así:

Código PHP:
<?php
while( $resultado mysql_fetch_array($familia) ){

$cadena=$resultado["post_text"];
$patron  "|<a\s+href[^<>]*>(.+?)</a>|";        
preg_match($patron$cadena$coincidencias);


//aquí cargo los divs y datos específicos correspondientes, 
//y para el recuento de fotos usando...
echo count ($coincidencias);

// luego algo mas de contenidos, y la foto...
print_r($coincidencias[(0)]);

//y una vez con esos datos finalizo el while 
}?>
¿Se está cargando mal los datos en el array? ¿porqué no pone cada bloque de código encontrado con RegExp (<a href="http://www.website.com/img.php?image=image1.jpg"><img src="http://www.website.com/img.php?image=image1_min.jpg" style="max-width: 210px; max-height: 230px"></a>)en cada registro del array
  #4 (permalink)  
Antiguo 18/09/2013, 08:37
 
Fecha de Ingreso: septiembre-2013
Mensajes: 33
Antigüedad: 10 años, 7 meses
Puntos: 4
Respuesta: Cargar datos extraidos con 'RegExpr' en array php

Bueno, he encontrado una solución, pero estoy convencido que no es la mas propia (igual que me pasó con la expresión regular, hice una que me valía pero su sintaxis, aunque válida era bastante fea).

Allá voy con mi solución a este segundo problema:

Código PHP:
 <?php
while( $resultado mysql_fetch_array($familia) ){

$cadena=$resultado["post_text"];
$patron  "|<a\s+href[^<>]*>(.+?)</a>|";        
preg_match_all($patron$cadena$coincidencias);


//aquí cargo los divs y datos específicos correspondientes, 
//y para el recuento de fotos usando...
echo count ($coincidencias[0]);

// luego algo mas de contenidos, y la foto...
print_r($coincidencias[0][0]);

//y una vez con esos datos finalizo el while 
}?>
La diferencia empieza en el preg_match, que lo he convertido en preg_match_all porque segun la documentación que se lee en http://es1.php.net/manual/es/function.preg-match.php(*estoy hasta los huevos del pu.. <noparse> que no me deja meter enlaces), dice que en el array que recibe los datos (denominado 'matches' en la explicación) tiene este comportamiento:
Cita:
Si se proporciona matches, entonces éste se llena con los resultados de la búsqueda. $matches[0] contendrá el texto que coincidió con el patrón completo, $matches[1] tendrá el texto que coincidió con el primer sub-patrón entre paréntesis capturado, y así sucesivamente.
Quizá por eso los resultados devueltos no estaban saliendo bien, porque preg_match iba utilizando sub-patrones en cada siguiente valor del array y si no usa todo el patrón el invento falla.

Con preg_match_all sin embargo devuelve todos los resultados que coinciden con el patrón, pero los carga todo en un array multidimensional de modo que los valores que necesito estan todos en $coincidencias[0] y va desde $coincidencias[0][0] hasta $coincidencias[0][n].

Eso está bien, porque así me funciona, es como tengo ahora hecho, pero me preocupa que genere este tipo de array porque tengo la sensación que pierde eficiencia y que debería cargar los datos en un array simple que fuese desde $coincidencias[0] hasta $coincidencias[n], sin mas.

También lo he intentado con preg_split() que funciona utilizando el patrón a modo de separador en una cadena... y a mi me funcionaría si tuviese los links puestos uno tras otro sin mas, pero coincide que los usuarios a veces, además de meter la serie de enlaces, introducen otro tipo de contenidos y textos por lo que necesito que se discrimine y seleccione solamente a las cadenas de texto que coinciden con el patrón.

POR CIERTO!!!! Estoy viendo el patrón que me pasó pateketrueke (|<a\s+href[^<>]*>(.+?)</a>|)... me surge la duda de si ese script resuelve mi problema al 100%

Lo que yo quiero extraer o usar es algo tipo <a href....><img src="http://www.forosdelweb.com/f18/cargar-datos-extraidos-con-regexpr-array-php-1073867/.......... ></a> (un link que contiene como objeto enlazado una imagen)
¿qué pasaría ante el siguiente código, <a href....>texto</a> , lo usaría también?

Desde ya, gracias.
  #5 (permalink)  
Antiguo 18/09/2013, 09:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Cargar datos extraidos con 'RegExpr' en array php

Usar preg_match_all() es necesario, sencillamente porque necesitas todas las coincidencias y dicha función es precisamente para ello, tal vez le captura (.+?) es innecesaria y sólo te quedaría un índice [0], pues por cada captura se añade un sub-array a la variables $matches de salida.

Cita:
Lo que yo quiero extraer o usar es algo tipo <a href....><img src="http://www.forosdelweb.com/f18/cargar-datos-extraidos-con-regexpr-array-php-1073867/f18/cargar-datos-extraidos-con-regexpr-array-php-1073867/.......... ></a> (un link que contiene como objeto enlazado una imagen)
¿qué pasaría ante el siguiente código, <a href....>texto</a> , lo usaría también?
Ahí las reglas cambian, una expresión regular debe ser formulada con la mayor precisión posible para evitar malas jugadas, si la frase "todos los enlaces que tengan una imagen dentro" es válida, entonces sería así:
Cita:
|<a[^<>]*>\s*<img[^<>]*/?>\s*</a>|
Lo cual significa:

- <a la secuencia de inicio del enlace
- [^<>]* cualquier cosa excepto < y >
- > el cierre de la etiqueta
- \s* cualquier cantidad de espacios
- <img la secuencia de inicio de la imagen
- [^<>]* cualquier cosa excepto < y >
- /? opcionalmente la diagonal
- > el cierre de la etiqueta
- \s* cualquier cantidad de espacios
- </a> la secuencia de cierre del enlace

Como puedes observar las expresiones regulares no son magia de otro mundo, si tienes algún otro problema concreto con RegExp te invito al sub-foro de expresiones regulares.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 18/09/2013, 09:58
 
Fecha de Ingreso: septiembre-2013
Mensajes: 33
Antigüedad: 10 años, 7 meses
Puntos: 4
Respuesta: Cargar datos extraidos con 'RegExpr' en array php

Gracias de nuevo.

Yo pensaba que con preg_match(), era suficiente, en tanto que el patrón que tu me pasaste me pareció que al empezar y terminar con el símbolo '|' (que yo lo estaba atribuyendo a un OR) ya empezaría a concatenar los resultados y que por eso yo no lo había logrado antes, pero ya vimos que no.

La preocupación que me quedaba con preg_match_all() era esa, que al usar un array multidimensional provoque una ralentización del script y baja de rendimiento pues en teoría los datos deberían poderse recopilar en un array simple... de ahí que lo haya posteado de nuevo para ver qué opinaba el personal y si era algo del lado del PHP que se estaba haciendo 'no del todo bien'.

En cuanto a la remodelación del patrón y la explicación de cada sección... ¡de lujo! así SI!!!!

Descuida, que mas veces me pasaré por la sección de RegExp (la específica suya)

Doy por solucionado el tema.

Etiquetas: fecha, registro
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:56.