Saltar al contenido

¿Cómo extraer img src, title y alt de html usando php?

Si encuentras alguna parte que no entiendes puedes dejarlo en la sección de comentarios y te ayudaremos lo más rápido posible.

Solución:

$url="http://example.com";

$html = file_get_contents($url);

$doc = new DOMDocument();
@$doc->loadHTML($html);

$tags = $doc->getElementsByTagName('img');

foreach ($tags as $tag) 
       echo $tag->getAttribute('src');

EDITAR: ahora que lo sé mejor

El uso de expresiones regulares para resolver este tipo de problema es una mala idea y probablemente generará un código que no se puede mantener y no es confiable. Mejor usa un analizador de HTML.

Solución con expresión regular

En ese caso, es mejor dividir el proceso en dos partes:

  • obtener toda la etiqueta img
  • extraer sus metadatos

Asumiré que su documento no es xHTML estricto, por lo que no puede usar un analizador XML. EG con el código fuente de esta página web:

/* preg_match_all match the regexp in all the $html string and output everything as 
an array in $result. "i" option is used to make it case insensitive */

preg_match_all('/
]+>/i',$html, $result); print_r($result); Array ( [0] => Array ( [0] => enlace del logotipo a la página de inicio [1] => vote up [2] => vote down [3] => imagen gravatar [4] => vote up [...] ) )

Luego obtenemos toda la etiqueta img attributes con un bucle:

$img = array();
foreach( $result as $img_tag)
src)=("[^"]*")/i',$img_tag, $img[$img_tag]);


print_r($img);

Array
(
    [enlace del logotipo a la página de inicio] => Array
        (
            [0] => Array
                (
                    [0] => src="/Content/Img/stackoverflow-logo-250.png"
                    [1] => alt="enlace del logotipo a la página de inicio" )

            [1] => Matriz (
                    [0] => origen
                    [1] => alt)

            [2] => Matriz (
                    [0] => "/Contenido/Img/stackoverflow-logo-250.png"
                    [1] => "enlace del logotipo a la página de inicio" ) )

    [vote up] => Matriz (
            [0] => Matriz (
                    [0] => src="/content/img/votar-flecha-arriba.png"
                    [1] => alt="votar"
                    [2] => title="Esto fue útil (haga clic de nuevo para deshacer)" )

            [1] => Matriz (
                    [0] => origen
                    [1] => alt
                    [2] => título)

            [2] => Matriz (
                    [0] => "/content/img/votar-flecha-arriba.png"
                    [1] => "votar"
                    [2] => "Esto fue útil (haga clic de nuevo para deshacer)" ) )

    [vote down] => Matriz (
            [0] => Matriz (
                    [0] => src="/content/img/votar-flecha-abajo.png"
                    [1] => alt="votar negativo"
                    [2] => title="Esto no fue útil (haga clic de nuevo para deshacer)" )

            [1] => Matriz (
                    [0] => origen
                    [1] => alt
                    [2] => título)

            [2] => Matriz (
                    [0] => "/content/img/votar-flecha-abajo.png"
                    [1] => "votar abajo"
                    [2] => "Esto no fue útil (haga clic de nuevo para deshacer)" ) )

    [gravatar image] => Matriz (
            [0] => Matriz (
                    [0] => src="https://foroayuda2.foroayuda.es/wp-content/uploads/2023/03/3-imagen-gravatar.jpg"
                    [1] => alt="imagen de gravado" )

            [1] => Matriz (
                    [0] => origen
                    [1] => alt)

            [2] => Matriz (
                    [0] => "https://foroayuda2.foroayuda.es/wp-content/uploads/2023/03/3-imagen-gravatar.jpg"
                    [1] => "imagen de gravado" ) )

   [..]
        ) )

Las expresiones regulares consumen mucha CPU, por lo que es posible que desee almacenar en caché esta página. Si no tiene un sistema de caché, puede modificar el suyo usando ob_start y cargando/guardando desde un archivo de texto.

¿Cómo funciona este material?

Primero, usamos preg_match_all, una función que obtiene cada string hacer coincidir el patrón y enviarlo en su tercer parámetro.

Las expresiones regulares:

]+>

Lo aplicamos en todas las páginas web html. se puede leer como cada string que empieza con “", contiene un carácter que no es ">" y termina con un >.

(alt|title|src)=("[^"]*")

Lo aplicamos sucesivamente en cada etiqueta img. se puede leer como cada string comenzando con "alt", "title" o "src", luego un "=", luego un ' " ', un montón de cosas que no son ' " ' y termina con un ' " '. Aísle las subcadenas entre ().

Finalmente, cada vez que quiera lidiar con expresiones regulares, es útil tener buenas herramientas para probarlas rápidamente. Compruebe este probador de expresiones regulares en línea.

EDITAR: respuesta al primer comentario.

Es true que no pensé en las (con suerte pocas) personas que usan comillas simples.

Bueno, si usa solo ', simplemente reemplace todos los " por '.

Si mezclas ambos. Primero debes darte una bofetada :-), luego intenta usar ("|') en su lugar o " y [^ø] para reemplazar [^"].

Solo para dar un pequeño ejemplo del uso de la funcionalidad XML de PHP para la tarea:

$doc=new DOMDocument();
$doc->loadHTML("Test
alt"); $xml=simplexml_import_dom($doc); // just to make xpath more simple $images=$xml->xpath('//img'); foreach ($images as $img) echo $img['src'] . ' ' . $img['alt'] . ' ' . $img['title'];

usé el DOMDocument::loadHTML() porque este método puede hacer frente a la sintaxis HTML y no fuerza que el documento de entrada sea XHTML. Estrictamente hablando, la conversión a un SimpleXMLElement no es necesario, solo hace que usar xpath y los resultados de xpath sean más simples.

Si te gusta la idea, tienes la libertad de dejar un ensayo acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *