lundi 4 mai 2009
Dans de nombreux exemples de code, j'ai vu des développeurs PHP (incluant moi-même, pas plus tard que dans mon exemple d'hier) utiliser un petit raccourci classique pour obtenir l'extension d'un fichier :
$file = 'infinite-loop.jpg';La combinaison des appels de end() et explode() permet d'utiliser le point comme séparateur de chaîne et de diviser le nom du fichier en sous-ensemble ("infinite-loop" et "jpg") retourné en tant qu'array qui sera passé en entrée à end() qui à son tour retournera le dernier élément de l'array, soit "jpg".
$extension = end(explode('.', $file));
echo $extension; // jpg
C'est pratique car on peut utiliser le même explode pour récupérer la première partie, soit "infinite-loop" en utilisant la fonction current() qui retourne le premier élément de l'array. Ça fonctionne bien quand on a seulement le nom du fichier mais imaginez à la place qu'on a l'exemple suivant :
$path = '/home/code18/infinite-loop.jpg';Ce que contiendrait $filename serait "home/code18/infinite-loop", incluant le chemin complet du fichier. Pour contourner ceci, on doit faire appel à basename() :
$filename = current(explode('.', $path));
$path = '/home/code18/infinite-loop.jpg';On obtient le nom du fichier, le nom sans extension et son extension mais on n'a pas encore isolé et extrait le répertoire. Un tour de magie :
$file = basename($path); // infinite-loop.jpg
$filename = current(explode('.', $file)); // infinite-loop
$ext = end(explode('.', $file)); // jpg
# /home/code18/La solution
echo str_replace($file, '', $path);
# ou sans se compliquer la vie :
# /home/code18 (sans le / de la fin)
echo dirname($path);
Pourtant, il y a un moyen très simple de faire tout cela d'un seul coup, avec la fonction built-in de PHP pathinfo() :
$path = 'http://www.google.ca/intl/en_ca/images/logo.gif';
$info = pathinfo($path);
echo $info['dirname']; // http://www.google.ca/intl/en_ca/images
echo $info['basename']; // logo.gif
echo $info['extension']; // gif
echo $info['filename']; // gif
Rahlala, comme quoi on ne lit pas suffisamment la doc, je ne connaissais pas du tout cette fonction... Le nombre de fois où je me suis tapé ça à la main :s j'ai honte...