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.
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
$path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; // "bill"
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
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();
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;
}
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
, tant Qu'il ne contient pas de chemin, vous pouvez également utiliser:
array_pop(explode('.',$fname))
Où $fname
est un nom de fichier, par exemple: my_picture.jpg
Et le résultat serait: jpg
, 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.
Voici un exemple, supposons que $filename soit " exemple.txt "
$ext = substr($filename,strrpos($filename,'.',-1),strlen($filename));
Donc $ext sera ".txt "
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];
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";
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;)
Cela fonctionnera
$ext = pathinfo($filename, PATHINFO_EXTENSION);
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()
Vous pouvez aussi essayer ceci:
pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)
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
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);
?>
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, '.'),'.');
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);
}
- Il fonctionne avec plusieurs parties à une extension, par exemple
tar.gz
- Code court et efficace
- Il fonctionne à la fois avec un nom de fichier et un chemin complet
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).