Comment Obtenir (Extraire) une extension de fichier en PHP?

C'est une question que vous pouvez lire partout sur le web avec diverses 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 il devrait être sur Stack Overflow.

629
demandé sur STLDeveloper 2008-10-06 15:00:02

22 réponses

Les gens d'autres langages de script pensent toujours que le leur est meilleur parce qu'ils ont une fonction intégrée pour le faire et pas PHP (je regarde pythonistas en ce moment: -)).

En fait, il existe, mais peu de gens le savent. Répondre 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 passez.

Rappelez-vous que si vous voulez être capable de traiter des caractères non ASCII, vous nécessité de définir les paramètres régionaux en premier. Par Exemple:

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

Notez également que cela ne prend pas en considération le contenu du fichier ou le type mimetype, 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 un chemin de ressources URL, qui sont couverts par PARSE_URL.

Profitez

1588
répondu e-satis 2017-06-20 15:47:29

pathinfo()

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

echo $path_info['extension']; // "bill"
141
répondu Adam Wright 2018-07-27 09:43:55

Utilisation plus sûre: PARSE_URL (au lieu de PATHINFO)


Par exemple, l'url est http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

PATHINFO renvoie:

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


PARSE_URL renvoie:

$x = parse_url($url);
$x['scheme']   'http'
$x['host']     'example.com'
$x['path']     '/myfolder/sympony.mp3'
$x['query']    'aa=1&bb=2'
$x['fragment'] ''             //<----- this outputs hashtag "XYZ" only in case, when the link containing that hashtag was manually passed to function, because automatically, hashtags are not automatically detectable by PHP

dirname(parse_url($url)['path'])                       /myfolder
basename(parse_url($url))                              sympony.mp3
pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION)  mp3

P. s. note, partie Hashtag de l'url (c'est-à-dire #smth) non disponible dans la requête PHP, mais uniquement avec javascript.


Pour des exemples utiles, voir: obtenir L'URL complète en PHP

72
répondu T.Todua 2018-04-14 09:00:30

Il y a aussi SplFileInfo:

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

Souvent, vous pouvez écrire un meilleur code si vous passez un tel objet au lieu d'une chaîne, votre code est plus parlant alors. Depuis PHP 5.4, c'est un one-liner:

$ext  = (new SplFileInfo($path))->getExtension();
51
répondu hakre 2012-10-17 10:32:32

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

Sinon, au lieu de compter sur une extension de fichiers, vous pouvez utiliser fileinfo ( http://us2.php.net/fileinfo ) pour déterminer le type MIME des fichiers.

Voici un exemple simplifié de traitement d'une image téléchargée par l'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;
}
19
répondu Toxygene 2016-08-17 18:52:55

1) Si vous êtes à l'aide de (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 affichera

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

2) une Autre façon d'obtenir l'extension, si vous êtes à l'aide de (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 affichera

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

/ / EDIT: suppression d'un support

12
répondu Subodh Ghulaxe 2014-11-25 13:09:14

, tant Qu'il ne contient pas de chemin, vous pouvez également utiliser:

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

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

9
répondu Anonymous 2012-08-11 12:49:05

, il est Parfois 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 qui ne posent généralement pas de problème, mais cela ne fait pas de mal d'être conscient de cette mise en garde.

9
répondu Alix Axel 2012-11-01 18:11:18

Le moyen le plus simple d'obtenir une extension de fichier en php est d'utiliser la fonction intégrée de php pathinfo.

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html
7
répondu Shahbaz 2015-05-13 06:44:32
substr($path, strrpos($path, '.') + 1);
5
répondu Kurt Zhong 2013-12-05 11:13:42

Voici un exemple, supposons que $filename soit " exemple.txt "

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

Donc $ext sera ".txt "

4
répondu G. I. Joe 2015-02-25 23:22:17

Une solution rapide serait quelque chose comme ceci.

    //exploding the file based on . 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];
4
répondu Annabelle 2015-05-26 09:29:54

Pathinfo est la matrice. Nous pouvons vérifier Nom du répertoire, Nom du fichier, 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";  
4
répondu Arshid KV 2016-06-03 04:43:04

Vous pouvez aussi essayer ceci
(travail 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
profitez-en;)

4
répondu pooya_sabramooz 2017-02-12 05:40:13

Cela fonctionnera

$ext = pathinfo($filename, PATHINFO_EXTENSION);
3
répondu Deepika Patel 2015-01-15 10:12:23

J'ai trouvé que les solutions pathinfo() et SplFileInfo fonctionnent bien pour les fichiers standard sur le système de fichiers local, mais vous pouvez rencontrer des difficultés si vous travaillez avec des fichiers distants car les URL pour les images valides peuvent avoir un # (identificateurs de fragment) et/ou ? (paramètres de requête) à la fin de

J'ai trouvé que c'était un moyen fiable d'utiliser pathinfo() sur une URL après l'avoir d'abord analysée pour éliminer les inutiles encombrement 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
répondu Jonathan Ellis 2015-01-20 20:40:36

Vous pouvez aussi essayer ceci:

 pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)
2
répondu smile 22121 2016-05-24 09:53:55

Pourquoi ne pas utiliser substr($path, strrpos($path,'.')+1); ? C'est la méthode la plus rapide de tout comparer. @ Kurt Zhong a déjà répondu.

Nous allons vérifier le résultat comparatif ici: https://eval.in/661574

2
répondu Abbas 2016-10-17 05:09:51

Vous pouvez obtenir toutes les extensions de fichier sur un dossier particulier et effectuer une opération avec une extension de fichier spécifique

<?php
    $files=glob("abc/*.*");//abc is 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 perticular extenstion type
        if($extension=='html'){
            //do operation
        }
    endfor;
    print_r($ext);
?>
1
répondu Samir Karmacharya 2016-05-04 05:35:14

Si vous recherchez de la vitesse (comme dans un routeur), vous ne voulez probablement pas tout tokeniser. Beaucoup d'autres réponses échoueront avec /root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');
1
répondu Ray Foss 2016-09-09 13:54:18

Bien que la "meilleure façon" est discutable, je crois que c'est le meilleur moyen pour quelques raisons:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. Il fonctionne avec plusieurs parties à une extension, par exemple tar.gz
  2. Code court et efficace
  3. Il fonctionne à la fois avec un nom de fichier et un chemin complet
1
répondu Dan Bray 2018-08-05 15:33:57

Utiliser

str_replace('.', '', strrchr($file_name, '.'))

Pour une récupération rapide de l'extension (si vous savez avec certitude que votre nom de fichier en a un).

-1
répondu AlexB 2012-11-28 12:05:26