Foros del Web » Programación para mayores de 30 ;) » RegExp »

Problema con al expresión regular para coger imágenes

Estas en el tema de Problema con al expresión regular para coger imágenes en el foro de RegExp en Foros del Web. Hola, soy nuevo en el foro y escribo a ver si serías tan amables de resolverme la duda: Estoy intentando coger las imágenes de una ...
  #1 (permalink)  
Antiguo 20/06/2013, 08:44
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Problema con al expresión regular para coger imágenes

Hola, soy nuevo en el foro y escribo a ver si serías tan amables de resolverme la duda:

Estoy intentando coger las imágenes de una web y he desarrollado un minicódigo con algunas cosillas que he encontrado por ahí, el problema es que las expresiones regulares que uso me cogen más de la cuenta, como textos, scripts, menus o no me cogen casi nada. Aquí os dejo el código a ver si me podeis echar una mano:

<?php
include_once "simple_html_dom.php";

$html = file_get_html('http://www.autoscout24.es//');

$re_extractImages = '/<img.*src=["\']([^ ^"^\']*)["\']/ims';

preg_match_all( $re_extractImages , $html , $matches );

$imagesInMyHtml = $matches[0];
echo '<br/ >';
$i = 0;
print_r($imagesInMyHtml);
?>

Otro código que he usado es este, q hace lo mismo creo:
<?php
include_once "simple_html_dom.php";

$html = file_get_html('http://www.autoscout24.es//');

if ( preg_match_all('<img[^>]*>', $html, $captures)){
echo $captures[0];
};
echo '<br/ >';
$i = 0;
print_r($captures);
?>

Soy bastante novato con el lenguaje y más aún con las expresiones regulares, ya me he mirado varios manuales, hecho ejemplos y me he hecho unos apuntes, pero la verdad q cuando necesito buscar algo no consigo hacerlo, también tiene bastante culpa que los ejemplos q hay por ahí son bastante simples, no encuentro ninguna página que profundice mucho en las expresiones regulares con ejemplos y que vayan subiendo de nivel, si sabeis alguna, estaría bien.

Al principio estaba usando preg_match porque pensaba que preg_match_all te partía la información como en subgrupos, pero parece q me funciona un pelín mejor con preg_match_all , no termino muy bien de ver la diferencia entre estas dos funciones.

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 20/06/2013, 08:45
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con al expresión regular para coger imágenes

Estas son todas las expresiones regulares que he usado ahsta ahora sin éxito:

'/img.+/'
/[^A-Z]img.+/
/(img)(\s?.+)+/
/src.+"$/
/^src.+/
/^src.+"$/
/src.+\.jpg/
/[^A-Z]src.+\.jpg/
/src="\.\/img\/.+\.jpg"/
/^src.+img\/.+\.jpg$/
/^<src>.+jpg+/
/<img.*src=["\']([^ ^"^\']*)["]/
<img[^>]*>
  #3 (permalink)  
Antiguo 20/06/2013, 09:28
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con al expresión regular para coger imágenes

Es más fácil usar DOM y extraer dichas imagenes a través de dicha API, la regla de oro de las expresiones regulares es "si existe algo que resuelva tu problema sin usar expresiones regulares entonces no las uses" y así aplica perfectamente en tu caso.

Si quieres aprender expresiones regulares entonces pido que muevan tu tema al sub foro de RegExp, si buscas únicamente resolver tu problema entonces consulta el manual de DOM/SimpleXML de PHP.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 20/06/2013, 10:21
Avatar de kikerrobles  
Fecha de Ingreso: mayo-2013
Ubicación: Oviedo
Mensajes: 17
Antigüedad: 10 años, 11 meses
Puntos: 2
Respuesta: Problema con al expresión regular para coger imágenes

Hola Novato. Si lo quieres hacer con expresiones regulares deberías aprender un poco, en lugar de hacer pruebas a lo loco, es una verdadera locura , no es complicado cuando le coges el tranquillo, pero si no es todo un galimatías, y si no sabes que estas utilizando no sabes que resultados vas a poder obtener.

Lo primero es que la diferencia entre preg_match y preg_match_all es que preg_match solo te devuelve la primera coincidencia en el array de valores, mientras que preg_match_all te las devuelve todas.

Lo segundo, una regla bien sencilla es:
/^<img.+src=.+>$/i

Quiere decir que:
  • Empieza la cadena: ^
  • los primeros carateres son: <img
  • después, y hasta encontrar: src
  • puede haber uno o más carateres:(primer) .+
  • despues de src tambien puede haber uno o más caracteres:(segundo).+
  • hasta encontrar un caracter de cierre de etiqueta: >
  • termina la cadena: $
  • y especificamos que no distinga entre mayúsculas y minúsculas: i, ya que puede haber alguna definida como IMG o con SRC
  • Y todo ello englobado dentro de / /

Habrá imágenes sin "src" con un evento onload() por ejemplo, y otras que tengan rutas locales y por eso no te las muestre.
Si tienes una del tipo <img src="../load/images/imagen.png"/> lo más probable es que no puedas sacar la ruta de forma automática porque no estén basadas en root/load/images/imagen.png, si no que sean por ejemplo root/admin/logos/load/images/imagen.png
Tendrías que procesar cada imagen, ver si la ruta es completa, y si no lo es, sabiendo de que url la sacas añadírsela al comienzo.

Para extraer solo la ruta deberías usar algo así:

/^<img.+src="(.+)".+>$/i

Donde todo lo que haya entre el paréntesis será al ruta de la imagen y después llamándolo con $1 lo puedes añadir como parámetro. Lo del paréntesis sería algo más complejo porque habría que espicidicar que si empieza con dos puntos se eliminen del resultado (?:\.\.)*(.+)

Así que haz caso al compañero pateke y extrae mediante el DOM todos los atributos "src" de los elementos "img". Prueba con JQuery que a lo mejor te resulta más sencillo.

Si sigues con expresiones regualres esta página te ayuda a verificar si son válidas y a ver que te devuelve el parámetro $1
[URL="http://www.metriplica.com/es/recursos/expresiones-regulares"]http://www.metriplica.com/es/recursos/expresiones-regulares[/URL]
  #5 (permalink)  
Antiguo 21/06/2013, 01:33
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con al expresión regular para coger imágenes

Hola Pateketrueke, lo primero gracias por tu respuesta. Pero me han obligado en el curro a aprender expresiones regulares y me han dicho q intente practicar con ejemplos como este, así q no puedo usar otra cosa, debo saber como se resuelve con una expresión regular y la verdad q me está costando. Muchas gracias de todas formas.

Kikerrobles, ya le he dedicado bastante tiempo a intentar aprender la verdad, lo que pasa q es bastante complicado, ya que no hay mucho material didactico en internet o al menos yo no lo encuentro, lo que encuentro es muy básico, lo q significa cada caracter y ejemplos sencillos, pero no de un poco más de nivel. Me he hecho un documento word cn apuntes y tengo varios archivos con ejemplos q he hecho. De hecho a las expresiones q me has dado ya las había empleado, lo q pasa q no he puesto todas en la respuesta q me mandé.
Esta es la respuesta q me da por pantalla con las expresiones q me has dado:
"Array ( )" tanto con la primera como con la segunda, exactamente la misma respuesta. La verdad q no entiendo por qué, si a ti se te ocurre algo, yo es q soy bastante nuevo en esto de programar aunq he avanzado y estudiado bastante ya.

La explicación q me has dado detallada de caracter a caracter es igual o parecidísima a la conclusión q saque yo para resolverlo, cogí la estructura y empecé a descomponerla y me kedo algo muy parecido sino lo mismo a lo q me diste. Lo que pasa q no me funciona no sé por qué :(.
Con una d con las q mejor me funciona es con sta: /<img.*src=["\']([^ ^"^\']*)["]/ q la verdad sta si q no la entiendo muxo con tanto caracter d inicio de cadena, había otra q hice q me daba un resultado muy parecido al de esta pero ambas me cogen texto q no es imagen y no sé como kitarlo.

Tb parece q tengo problemas cuando pongo el inicio de cadena ^ o el fin $, no sé por qué, o a lo mejor es q me toy rayando yo sólo.

Muchisimas gracias por tu respuesta Kikerrobles, si se te ocurre algo más con lo q te dixo y con la salida de pantalla q me da, sería perfecto.
  #6 (permalink)  
Antiguo 21/06/2013, 01:54
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con al expresión regular para coger imágenes

En las expresiones que me has dado después d img no iría \s para recoger el espacio en blanco q suele haber detrás de img, porque si no estoy ekivocado el punto no recoge espacios en blanco no?
De todas formas acabo de probar a meter \s y me devuelve lo mismo: "Array ( ) "
  #7 (permalink)  
Antiguo 21/06/2013, 02:04
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con al expresión regular para coger imágenes

En cuanto a lo que dices de que algunas imagenes no me las sacará por la ruta está bien saberlo, pero me debería de sacar algunas por lo menos y sin texto no?

Llevo desde el lunes con expresiones regulares, aprendiendo, de seguido y avanzando rápido, pero he llegado a un punto en el que parece que no puedo avanzar más, no encuentro recursos para ello, la verdad q es agobiante la situación de tener que avanzar y no saber como.
  #8 (permalink)  
Antiguo 21/06/2013, 06:52
Avatar de kikerrobles  
Fecha de Ingreso: mayo-2013
Ubicación: Oviedo
Mensajes: 17
Antigüedad: 10 años, 11 meses
Puntos: 2
Respuesta: Problema con al expresión regular para coger imágenes

Sería interesante ver las cadenas <img....> que recoges para poder ajustarla más, documentación tienes mucha y muy amplia sobre expresiones regulares, en cualquiera de ellas encuentras que "^" no solo sirve como comienco de cadena...
Echa un vistacillo al menos para saber para que más se usa

Además usa PREG_PATTERN_ORDER en la función preg_match_all() y recogres los resultados en $resultados[1], en el [0] no los ibas a sacar.
  #9 (permalink)  
Antiguo 21/06/2013, 07:49
 
Fecha de Ingreso: junio-2013
Ubicación: Madrid
Mensajes: 61
Antigüedad: 10 años, 10 meses
Puntos: 5
Respuesta: Problema con al expresión regular para coger imágenes

Si te soy sincero no entiendo muy bien lo que me kieres decir. Arriba en mi primer mensaje puse el código que uso, si copias y pegas eso en el eclipse ya tienes todo lo q yo tengo...

Etiquetas: coger, html, php, 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 14:39.