Encontrar imágenes no usadas en un proyecto web con PHP

Es necesario ejecutarlo desde un servidor web.

<?php
/**
 * Recorrer directorios y listar todas las imágenes disponibles.
 *
 * @param string $dir El directorio a recorrer.
 * @return array Lista de todas las imágenes disponibles.
 */
function listarTodasLasImagenes($dir) {
    echo '<h1>Todas</h1>';
    $imagenes = [];
    $extensionesPermitidas = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'webp'];

    // Crear un iterador recursivo para recorrer el directorio
    $iterador = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

    foreach ($iterador as $archivo) {
        if ($archivo->isFile()) {
            $extension = pathinfo($archivo->getFilename(), PATHINFO_EXTENSION);
            if (in_array(strtolower($extension), $extensionesPermitidas)) {
                $string = $archivo->getPathname();
                $pos = strpos($string, 'assets');
                $imgPathOK = substr($string, $pos);
                $imagenes[] = $imgPathOK;
                echo $imgPathOK.'<br>';
            }
        }
    }

    return $imagenes;
}

/**
 * Recorrer directorios y listar imágenes usadas en el proyecto.
 *
 * @param string $dir El directorio a recorrer.
 * @return array Lista de imágenes encontradas.
 */
function listarImagenesUsadas($dir) {
    echo '<h1>Usadas</h1>';
    $imagenes = [];
    $extensionesPermitidas = ['jpg', 'jpeg', 'png', 'gif', 'svg', 'webp'];

    // Crear un iterador recursivo para recorrer el directorio
    $iterador = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

    foreach ($iterador as $archivo) {
        if ($archivo->isFile()) {
            $contenido = file_get_contents($archivo->getPathname());

            // Buscar referencias a imágenes en el contenido del archivo
            preg_match_all('/<img[^>]+src=["\']([^"\']+)["\']/i', $contenido, $coincidencias);
            preg_match_all('/url\(["\']?([^"\')]+)["\']?\)/i', $contenido, $coincidenciasCSS);

            // Agregar las imágenes encontradas a la lista
            foreach ($coincidencias[1] as $imagen) {
                $extension = pathinfo($imagen, PATHINFO_EXTENSION);
                if (in_array(strtolower($extension), $extensionesPermitidas)) {
                    $imagenes[] = $imagen;
                    echo 'T1 '.$imagen.'<br>';
                }
            }

            foreach ($coincidenciasCSS[1] as $imagen) {
                $extension = pathinfo($imagen, PATHINFO_EXTENSION);
                if (in_array(strtolower($extension), $extensionesPermitidas)) {
                    $imagenes[] = $imagen;
                    echo 'T2 '.$imagen.'<br>';
                }
            }
        }
    }

    return array_unique($imagenes);
}

// Directorio del proyecto y de las imágenes
$directorioProyecto = '../www/es_ES';
$directorioImagenes = '../www/es_ES/assets/images';
$directorioUnused = '../www/es_ES/unused-imgs';

// Obtener la lista de todas las imágenes disponibles
$todasLasImagenes = listarTodasLasImagenes($directorioImagenes);

// Obtener la lista de imágenes usadas en el proyecto
$imagenesUsadas = listarImagenesUsadas($directorioProyecto);

// Convertir las rutas relativas de las imágenes usadas a absolutas
$imagenesUsadasAbsolutas = array_map(function($imagen) use ($directorioProyecto) {
    return realpath($directorioProyecto . '/' . $imagen);
}, $imagenesUsadas);

// Encontrar las imágenes no usadas
$imagenesNoUsadas = array_diff($todasLasImagenes, $imagenesUsadas);

// Imprimir la lista de imágenes no usadas
echo "<h1>Imágenes no usadas en el proyecto:</h1>";
foreach ($imagenesNoUsadas as $imagen) {
    $nombreImagen = basename($imagen);
    echo $imagen . "<br/>";
    $nuevoPath = $directorioUnused . '/' . $nombreImagen;
    if (rename('../www/es_ES/'.$imagen, $nuevoPath)) {
        echo "Movida: $imagen -> $nuevoPath<br/>";
    } else {
        echo "Error al mover: $imagen<br/>";
    }
}
?>	

Scroll al inicio