Outre le fait de devoir renommer ses variables et ses liens, afin d'éviter tout problème d'affichage, résultant de l'encodage des caractères, il est aussi nécessaire de renommer ses noms de fichiers.
Et pourquoi le faire manuellement, fichier par fichier, lorsque php nous facilite autant la vie ?
<?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);
?>