Do not speak Spanish? Read this post in English.

Martes, 17 d marzo d 2009.

Sacar imágenes de un documento html con php

Aquí la solución a un problema típico cuando tienes que tratar con html ya formado, bien sea porque estás parseando una web externa o porque estás intentando aprovechar funcionalidades de un CMS para otras cosas (mi caso ahora mismo).

Lo que tenemos es un documento en html con sus imágenes incluidas en su interior y lo que buscamos es extraer las imágenes para usarlas en otro sitio y no en ese documento. Por ejemplo, para presentar un thumbnail de ese texto en un índice o listado.

Para conseguirlo usaremos la función de php preg_mach_all(), una función que a base de marcar banderas en una expresión regular nos permite extraer directamente a un array las coincidencias con la expresión.

Suponiendo que ya hemos capturado nuestro html a la variable $myHTML la secuencia sería la siguiente:


// Nuestra expresión regular, que busca los src dentro
// de las etiquetas <img/>
// y que no tenga en cuenta mayusculas o minusculas
$re_extractImages = '/<img.*src=["\']([^ ^"^\']*)["\']/ims';

// uso de preg_mach_all con la expresion regular
preg_match_all( $re_extractImages  , $myHtml , $matches );

// como nuestra expresión saca 2 arrays de coincidencias
// pasamos a variable solo el que nos interesa
$imagesInMyHtml = $matches[1];

¿Y si luego, ya que hemos extraído las imágenes, queremos quitarlas del html? Bien, para eso usamos una función más sencilla: eregi_replace() que nos permite hacer replace con expresiones regulares que no distinguen entre mayúsculas y minúsculas.

Su uso en este caso sería el siguiente.

$re_cleanImages = '<img[^>]*>';
$myCleanHtml = eregi_replace($re_cleanImages,'',$myHtml);

* Cuidado al usar esta función que no queden

vacíos...

Extra

Por si hace falta dejo también las expresiones regulares si lo que queremos es solo extraer las imágenes de nuestro dominio o solo eliminar las mismas:

// Recogemos nuestro dominio y escapamos los puntos.
$myDomainInER = str_replace(".","\.",$_SERVER['HTTP_HOST'] );
// Expresion regular para rescatar imágenes
$re_extractImages = '/<img.*src=["\'][^ ^"^\']*'.$myDomainInER.'([^ ^"^\']*)["\']/';
// Expresion regular para reemplazar las imágenes
$re_cleanImages = '<img[^>]*'.$myDomain.'[^>]*>';

Temas Relacionados: programacion

Autor:

9 Comentarios para “Sacar imágenes de un documento html con php”

  1. vladimir dice:

    me pregunto si no seria mas sencillo usar la clase DOMDocument, y extraer las imagenes "a lo jquery"

    • ikhuerta dice:

      No se Vladimir,

      Piensa que hablo de extraer una imagen de un fragmento html (inicialmente un post de wordpress por ejemplo).

      A lo jQuery como dices (aparte de que solo iría en php5 lo cual no es tampoco demasiado preocupante) tengo que iniciar un objeto DOMDocument, cargar el HTML, iniciar otro objeto DOMXPath y lanzarlo. ¿No crees que es mucha carga para una operación que puede resolverse con una expresión regular sencilla?

      Realmente, no lo se, no he usado mucho DOMDocument y no se realmente lo que carga la máquina...

  2. esteban dice:

    Hola amigo, muy bueno el codigo, cometario, fijate en el codigo del eregi_replace()que esta mal escrita la variable en eregi_replace() en vez de decir $re_cleanImages dice $er_cleanImages, saludos y gracias, me sirvio de mucho

  3. Jheyson dice:

    Muy bueno y sencillo, andaba buscando algo así...

  4. Alberto dice:

    ¿Y que pasa si las imágenes tienen mayúsculas?

  5. David dice:

    Hola!

    Me ha sido muy útil tu script sólo un apunte, si el servidor diferencia entre mayúsculas y minúsculas da problemas y es mejor quitar el strtolower del html.

    Gracias por el aporte!

    • ikhuerta dice:

      Buenas David,

      He arreglado el código. Ahora la expresion regular es case insensitive y por tanto ya no hace falta pasar a minusculas el texto. Por otro lado también he añadido a la expresion que acepte saltos de línea.

  6. Yusnier dice:

    Muy bueno el script y pensado de una forma bien sencilla, gracias!

Anímate y deja tu comentario

Esto son experimentos, no preguntes ;) prueba metadescription Juego Prueba title Seo

render4