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
// y que no tenga en cuenta mayusculas o minusculas
$re_extractImages = '/
¿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 = ']*>';
$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 = '/]*'.$myDomain.'[^>]*>';
9 respuestas a “Sacar imágenes de un documento html con php”
me pregunto si no seria mas sencillo usar la clase DOMDocument, y extraer las imagenes «a lo jquery»
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…
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
bien visto, ya lo he corregido.
muchas gracias! 🙂
Muy bueno y sencillo, andaba buscando algo así…
¿Y que pasa si las imágenes tienen mayúsculas?
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!
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.
Muy bueno el script y pensado de una forma bien sencilla, gracias!