Besides having to rename variables and links to avoid display problems, resulting from the character encoding, it is also necessary to rename filenames.
And why do it manually, file by file, whereas PHP can make it so easily?
<?php
//header('Content-Type: text/html; charset=utf-8');
// Renomme $nomFichier de $dossier dont le nom est encodé en 'ISO-8859-1' (par défaut)
// charset utilisé : celui du système de fichiers sous Windows, pas 'utf-8'
function renommeFichier($dossier, $nomFichier, $charset='ISO-8859-1') {
echo " | AVANT --> ". $nomFichier . "<br />\n";
// transforme les caractères spéciaux en entités html
$str = htmlentities($nomFichier, ENT_NOQUOTES, $charset);
//echo " | Conversion --> " . $str . "<br />\n";
// On remplace les accents :
$str = preg_replace('#&([A-Za-z])(acute|cedil|circ|grave|ring|tilde|uml);#', '\1', $str);
// On remplace les ligatures du style 'œ'
$str = preg_replace('#&([A-Za-z]{2})(lig);#', '\1', $str);
// On supprime les autres entités commençant par &
$str = preg_replace('#&[^;]+;#', '', $str);
// On supprime les parenthèses et les crochets
$str = preg_replace('#[\[\]\(\)]#', '', $str);
// On remplace les espaces et les soulignés _ (underscores) par des tirets
$str = preg_replace('#[ _]#', '-', $str);
if ($nomFichier != $str) {// Si le nouveau nom est différent de l'ancien
if (file_exists($dossier . $str)) // Si le nouveau nom existe déjà,
echo " !!! On a trouvé un DOUBLE --> <strong>" . $str . "</strong><br />\n";
for ( $i = 0; file_exists($dossier . $str); $i++ ) { // on renomme la variable $str à l'avance
$dernierPoint = strrpos($str,'.'); // Position du dernier point
$str = substr($str,0,$dernierPoint)."-".substr($str,$dernierPoint);
}
rename($dossier . $nomFichier , $dossier . $str); // On renomme $nomFichier en $str dans $dossier
echo " | APRÈS --> <strong>" . $str . "</strong><br />\n";
}
} // Fin de la déclaration de la fonction renommeFichier()
// Parcourt le dossier $dossier à la recherche de fichiers à renommer
function parcourir($dossier) {
if (!preg_match('#/$#', $dossier)) { // Si le nom du dossier ne se termine pas par un /
$dossier .= '/'; // on en ajoute un
}
// echo "On vient d'ajouter un / à la fin du chemin<br />\n";
if (is_dir($dossier)) // Si c'est bien un dossier existant
if ($dh = @opendir($dossier)) { // Si on peut ouvrir le dossier donné en argument
if ( ($fichier = readdir($dh)) === FALSE ) // S'il ne contient aucun fichier
echo "Y a rien là !"; // on l'indique
else echo "Dans le dossier ".$dossier."<br />\n";
// Sinon on parcourt le dossier tant qu'on trouve quelque chose
while (($fichier = readdir($dh)) !== FALSE) {
//echo "On a trouvé ça ". utf8_decode($fichier)."<br />\n";
if ( ($fichier == '.') || ($fichier == '..') ) { // On évite le dossier parent et lui-même
continue; // On ne fait rien
} elseif (is_dir($dossier . $fichier)) { // Si on a trouvé un dossier contenu dans $dossier
parcourir($dossier . $fichier); // Récursivité
} else { // Sinon on renomme
echo "On a trouvé ce fichier :<br />\n";
renommeFichier($dossier, $fichier);
}
}
@closedir($dh); // On ferme le dossier après l'avoir ouvert
echo "On vient de fermer le dossier.";
} else echo "Impossible d'ouvrir le dossier ".$dossier." !!!\n";
else echo "Ce dossier n'existe pas !\n";
} // Fin de la déclaration de la fonction parcourir()
// Si un dossier est fourni par méthode $_GET, on le prend, sinon c'est un dossier par défaut
$rep = !empty($_GET["dossier"]) ? $_GET["dossier"] : "dos_test";
// Appel : Il faut indiquer le chemin complet du dossier test
parcourir($_SERVER['DOCUMENT_ROOT'].$rep);
?>