226 votes

PHP, obtenir le nom d'un fichier sans son extension

J'ai ce code PHP :

function ShowFileExtension($filepath)
{
    preg_match('/[^?]*/', $filepath, $matches);
    $string = $matches[0];

    $pattern = preg_split('/\./', $string, -1, PREG_SPLIT_OFFSET_CAPTURE);

    if(count($pattern) > 1)
    {
        $filenamepart = $pattern[count($pattern)-1][0];
        preg_match('/[^?]*/', $filenamepart, $matches);
        return strtolower($matches[0]);
    }
}

Si j'ai un fichier nommé my.zip cette fonction renvoie .zip .

Je veux faire l'inverse, je veux que la fonction renvoie my sans l'extension.

Le fichier est juste une chaîne de caractères dans une variable.

0 votes

437voto

Pekka 웃 Points 249607

Pas besoin de tout ça. Regardez pathinfo() il vous donne toutes les composantes de votre parcours.

Exemple tiré du manuel :

$path_parts = pathinfo('/www/htdocs/index.html');

echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // filename is only since PHP 5.2.0

Sortie du code :

/www/htdocs
index.html
html
index

Et alternativement vous pouvez obtenir seulement certaines parties comme :

echo pathinfo('/www/htdocs/index.html', PATHINFO_EXTENSION); // outputs html

3 votes

Pourquoi ce texte a-t-il été rétrogradé ? La réponse est tout à fait correcte. pathinfo opère sur des chaînes de caractères, donc peu importe si le fichier est réellement sur le serveur ou non.

16 votes

Il est regrettable qu'ils aient mal nommé "basename", puisqu'il renvoie le nom de fichier complet avec l'extension, et non le nom de base.

2 votes

@Oscar c'est le sens le plus largement compris du terme. basename . Pas d'erreur de dénomination.

209voto

Gordon Points 156415

Comme alternative à pathinfo() vous pouvez utiliser

  • basename() - Retourne le composant nom de fichier du chemin

Exemple tiré du manuel PHP

$path = "/home/httpd/html/index.php";
$file = basename($path);         // $file is set to "index.php"
$file = basename($path, ".php"); // $file is set to "index"

Il faut cependant connaître à l'avance l'extension pour le retirer.

Cependant, puisque votre question suggère que vous avez besoin d'obtenir l'extension y le nom de base, je voterais La réponse de Pekka comme la plus utile, car elle vous donnera toutes les informations que vous voulez sur le chemin et le fichier avec une seule fonction native.

1 votes

Que faire si je ne connais pas l'extension de fichier ? disons que si le chemin est dynamique, n'importe quel type d'extension de fichier peut s'y trouver ! ! alors que faire ? ?

0 votes

@user889030 alors vous avez un scénario différent de celui de l'OP et n'utilisez pas basename mais pathinfo comme indiqué ailleurs sur la page.

92voto

yckart Points 7517

https://php.net/manual/en/function.pathinfo.php

pathinfo($path, PATHINFO_FILENAME);

Test fonctionnel simple : https://ideone.com/POhIDC

0 votes

Cela renverrait le nom du fichier avec extension

2 votes

@user966939 Mhh, non. avec L'extension est basename ;-)

0 votes

De toute façon, il demandait une solution SANS extension. ;)

13voto

caiosm1005 Points 571

Une autre approche consiste à utiliser des expressions régulières.

$fileName = basename($filePath);
$fileNameNoExtension = preg_replace("/\.[^.]+$/", "", $fileName);

Cela supprime de la dernière période . jusqu'à la fin de la chaîne.

0 votes

J'aime cette réponse, très simple et qui fonctionne quand on ne connaît pas l'extension.

0 votes

C'est beaucoup mieux que d'utiliser explode, et cela ne prend en compte que la dernière section de points au cas où vous utiliseriez des points dans les noms de fichiers.

8 votes

No c'est bien pire. Arrêtez de regexer les gens.

7voto

fire Points 9036

@Gordon basename fonctionnera bien si vous connaissez l'extension, sinon vous pouvez utiliser explode :

$filename = end(explode(".", $file));

1 votes

Veuillez me faire parvenir vos commentaires à l'aide de la fonction de commentaire située sous ma réponse. La fonction la plus appropriée pour cela est pathinfo c'est pourquoi j'ai donné basename comme alternative seulement. Il n'est pas nécessaire de réinventer pathinfo avec regex ou explode .

4 votes

@fire, Votre mise à jour n'a aucun sens. end(explode(".", $file)); vous donne l'extension, pas le nom du fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X