web-dev-qa-db-fra.com

Comment obtenir (extraire) une extension de fichier en PHP?

C’est une question que vous pouvez lire partout sur le Web avec différentes réponses:

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

$exts = split("[/\\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

etc.

Cependant, il y a toujours "le meilleur moyen" et cela devrait être sur Stack Overflow.

687
e-satis

Les personnes d'autres langages de script pensent toujours qu'elles sont meilleures parce qu'elles ont une fonction intégrée pour le faire et non pas PHP (je suis en train de regarder Pythonistas en ce moment :-)).

En fait, cela existe, mais peu de gens le savent. Rencontrez pathinfo() :

$ext = pathinfo($filename, PATHINFO_EXTENSION);

C'est rapide et intégré. pathinfo() peut vous donner d'autres informations, telles que le chemin canonique, en fonction de la constante que vous lui transmettez.

N'oubliez pas que si vous souhaitez gérer les caractères non ASCII, vous devez d'abord définir les paramètres régionaux. PAR EXEMPLE:

setlocale(LC_ALL,'en_US.UTF-8');

Notez également que cela ne prend pas en compte le contenu du fichier ou le type mime, vous obtenez uniquement l'extension. Mais c'est ce que vous avez demandé.

Enfin, notez que cela ne fonctionne que pour un chemin de fichier, pas pour un chemin de ressources URL, qui est couvert à l'aide de PARSE_URL.

Prendre plaisir

1708
e-satis

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"
155
Adam Wright

Exemple d'URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

Pour les URL, n'utilisez pas PATHINFO :

_$x = pathinfo($url);
$x['dirname']   ???? 'http://example.com/myfolder'
$x['basename']  ???? 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
$x['extension'] ???? 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
$x['filename']  ???? 'sympony'
_

Utilisez PARSE_URL à la place:

_$x = parse_url($url);
$x['scheme']  ???? 'http'
$x['Host']    ???? 'example.com'
$x['path']    ???? '/myfolder/sympony.mp3'
$x['query']   ???? 'aa=1&bb=2'
$x['fragment']???? 'XYZ'
_

Remarque: les hashtags ne sont pas disponibles côté serveur, uniquement s'ils ont été ajoutés manuellement.


Pour tous les exemples PHP natifs, voir: Obtenir l'URL complète en PHP

90
T.Todua

Il y a aussi SplFileInfo :

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

Souvent, vous pouvez écrire un meilleur code si vous transmettez un tel objet à la place d'une chaîne. Votre code est plus parlé alors. Depuis PHP 5.4, il s’agit d’un one-liner:

$ext  = (new SplFileInfo($path))->getExtension();
56
hakre

La réponse de E-satis est la bonne façon de déterminer l'extension de fichier.

Au lieu de compter sur une extension de fichier, vous pouvez également utiliser le paramètre fileinfo pour déterminer le type de fichier MIME.

Voici un exemple simplifié de traitement d'une image téléchargée par un utilisateur:

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}
21
Toxygene

1) Si vous utilisez (PHP 5> = 5.3.6) vous pouvez utiliser SplFileInfo :: getExtension - Obtient l'extension de fichier

Exemple de code

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

Cela produira

string(3) "png"
string(2) "gz"

2) Un autre moyen d'obtenir l'extension si vous utilisez (PHP 4> = 4.0.3, PHP 5) est pathinfo

Exemple de code

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

Cela produira

string(3) "png"
string(2) "gz"

// EDIT: enlevé un crochet

12
Subodh Ghulaxe

Tant qu'il ne contient pas de chemin, vous pouvez également utiliser:

array_pop(explode('.', $fname))

$fname est le nom du fichier, par exemple: my_picture.jpg. Et le résultat serait: jpg

11
Anonymous

Parfois, il est utile de ne pas utiliser pathinfo($path, PATHINFO_EXTENSION). Par exemple:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

Notez également que pathinfo ne parvient pas à gérer certains caractères non-ASCII (généralement, il les supprime simplement de la sortie). Dans les extensions, cela ne pose généralement pas de problème, mais il n’est pas inutile de prendre conscience de cette mise en garde.

10
Alix Axel

Vous pouvez aussi essayer ceci (cela fonctionne sur PHP 5. * et 7):

$info = new SplFileInfo('test.Zip');
echo $info->getExtension(); // ----- Output -----> Zip

Astuce: il retourne une chaîne vide si le fichier n'a pas d'extension

7
pooya_sabramooz

Le moyen le plus simple d'obtenir l'extension de fichier dans PHP consiste à utiliser la fonction intégrée de PHP pathinfo .

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html
7
Shahbaz

Une solution rapide serait quelque chose comme ça.

// Exploding the file based on the . operator
$file_ext = explode('.', $filename);

// Count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count = count($file_ext);

// Minus 1 to make the offset correct
$cnt = $file_ext_count - 1;

// The variable will have a value pdf as per the sample file name mentioned above.
$file_extension = $file_ext[$cnt];
5
version 2
substr($path, strrpos($path, '.') + 1);
5
Kurt Zhong

pathinfo est un tableau. Nous pouvons vérifier le nom du répertoire, le nom du fichier, l’extension , etc.:

$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";
5
Arshid KV

Voici un exemple. Supposons que $ nomfichier soit "exemple.txt",

$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));

Donc, $ ext sera ".txt".

4
G. I. Joe

Ça va marcher

$ext = pathinfo($filename, PATHINFO_EXTENSION);
3
Deepika Patel

J'ai trouvé que les solutions pathinfo() et SplFileInfo fonctionnaient bien pour les fichiers standard du système de fichiers local, mais vous pouvez rencontrer des difficultés si vous travaillez avec des fichiers distants, car les URL des images valides peuvent avoir un # (identificateurs de fragment) et/ou ? (paramètres de requête) à la fin de l'URL, que ces deux solutions vont (incorrectement) traiter comme faisant partie de l'extension de fichier.

J'ai trouvé que c'était un moyen fiable d'utiliser pathinfo() sur une URL après la première analyse, afin de supprimer l'encombrement inutile après l'extension de fichier:

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
3
Jonathan Ellis

Utilisez substr($path, strrpos($path,'.')+1);. C'est la méthode la plus rapide de toutes les comparaisons.

@Kurt Zhong a déjà répondu.

Vérifions le résultat comparatif ici: https://eval.in/661574

2
Abbas

Vous pouvez aussi essayer ceci:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
2
smile 22121

Bien que la "meilleure façon" soit discutable, je crois que c'est la meilleure pour plusieurs raisons:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. Cela fonctionne avec plusieurs parties à une extension, par exemple tar.gz
  2. Code court et efficace
  3. Cela fonctionne avec un nom de fichier et un chemin complet
1
Dan Bray

Vous pouvez obtenir toutes les extensions de fichier dans un dossier particulier et effectuer des opérations avec une extension de fichier spécifique:

<?php
    $files = glob("abc/*.*"); // abc is the folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0; $i<count($files); $i++):
         $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
         $ext[] = $extension;
         // Do operation for particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>
1

Si vous recherchez de la vitesse (dans un routeur, par exemple), vous ne voulez probablement pas tout marquer. Beaucoup d'autres réponses vont échouer avec /root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');
1
Ray Foss

OMI, c'est la meilleure façon si vous avez des noms de fichiers comme nom.nom.nom.ext (moche, mais cela arrive parfois):

$ext     = explode('.', $filename); // Explode the string
$ext_len = count($ext) - 1; // Count the array -1 (because count() starts from 1)
$my_ext  = $ext[$ext_len]; // Get the last entry of the array

echo $my_ext;
0
Tommy89

En fait, je cherchais ça.

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);
0
Fred

ltrim(strstr($file_url, '.'), '.')

c’est le meilleur moyen si vous avez un nom de fichier comme nom.nom.nom.ext (moche, mais il arrive parfois

0
Anjani Barnwal