PHP, obtenez le nom du fichier sans extension de fichier


205

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 revient .zip.

Je veux faire l'inverse, je veux que la fonction revienne mysans l'extension.

Le fichier est juste une chaîne dans une variable.


Réponses:


398

Pas besoin de tout ça. Consultez pathinfo () , il vous donne tous les composants de votre chemin.

Exemple 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 ne pouvez obtenir que certaines pièces comme:

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

3
Pourquoi cela a-t-il été rejeté? La réponse est absolument correcte. pathinfo fonctionne sur les chaînes, donc peu importe si le fichier se trouve réellement sur le serveur ou non.
Gordon

13
Il est regrettable qu'ils aient mal nommé "nom de base", car il renvoie le nom de fichier complet avec l'extension, pas le nom de base.
Oscar

1
@Oscar c'est la signification la plus largement comprise du terme basename. Pas de dénomination.
nawfal

1
Ceci est très utile, surtout lorsque vous n'avez pas besoin de connaître l'extension du fichier pour l'extraire.
Vahid Amiri

Il s'agit d'une solution extrêmement élégante. Gloire. Cela devrait être marqué comme la bonne réponse.
Native Coder

199

Comme alternative à pathinfo(), vous pouvez utiliser

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

Exemple 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"

Vous devez cependant connaître l'extension pour la supprimer à l'avance.

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


1
que faire si je ne connais pas l'extension de fichier .. disons si le chemin est dynamique n'importe quel type d'extension de fichier peut y entrer !! alors quoi ??
user889030

@ user889030 alors vous avez un scénario différent de celui de l'OP et ne l'utilisez pas basename, mais pathinfocomme indiqué ailleurs sur la page.
Gordon

72

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

pathinfo($path, PATHINFO_FILENAME);

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


Cela retournerait le nom de fichier avec l' extension
user966939

2
@ user966939 Mhh, non avec extension est basename;-)
yckart

Eh bien, de toute façon, il demandait une solution SANS extension. ;)
user966939

2
@ user966939, Mec il n'y a pas d'extension du tout. Ce n'est PATHINFO_FILENAMEpas PATHINFO_EXTENSION ...
Pacerier

20
Celui qui a décidé de filenamene pas avoir d'extension alors basenamequ'il doit avoir des tendances sadiques ...
Mark

12

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.


J'aime cette réponse, très simple et qui fonctionne quand vous ne connaissez pas l'extension.
relipse

Beaucoup mieux que d'utiliser Explode, et n'attrape que la dernière section de période au cas où vous auriez utilisé des périodes dans les noms de fichiers
Kiwizoom

7
Non , c'est bien pire. Arrêtez de regexer les gens.
Pacerier

Merci, et les commentaires ci-dessus l'ont cloué. Ne pas avoir à connaître l'extension rend cela plus utile.
James Taylor

1
@ caiosm1005, La surface d'attaque augmente immédiatement car il est difficile de raisonner contre les composants internes d'un moteur regex. Par exemple, dans le code ci-dessus, il ne serait pas étrange s'il y a une entrée $fileNamequi pourrait faire fonctionner le moteur en temps exponentiel (ou pire). Et en supposant que nous ayons fini de disséquer les composants internes de ce moteur regex spécifique et que nous avons théoriquement prouvé qu'il était robuste contre toutes les valeurs $fileNamepossibles, le code n'est toujours pas arbitrairement portable sur une autre plate-forme qui a une autre implémentation du moteur regex.
Pacerier

12

Si l'extension n'est pas connue, utilisez cette solution

 pathinfo('D:/dir1/dir2/fname', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.php', PATHINFO_FILENAME); // return "fname"
 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "fname"

 pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_DIRNAME) . '/' . pathinfo('D:/dir1/dir2/fname.jpg', PATHINFO_FILENAME); // return "D:/dir1/dir2/fname"

PHP MAN, fonction pathinfo


Veuillez fournir une page similaire à la page de manuel de php pathinfo. Cela aidera OP à améliorer la ShowFileExtensionméthode et fournira une lecture supplémentaire à toute personne essayant de trouver cette réponse. Aussi une petite description ne s'égarerait pas ...
Michael Coxon

1
J'ai déjà répondu à cette question avec la même solution, ~ 2 ans avant la vôtre;)
yckart

@yckart true mais cela donne plusieurs exemples dans la réponse. Le vôtre a l'avantage de créer un lien vers ideone.com, mais le site peut être déconnecté.
Adam Elsodaney

7

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

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

1
Veuillez m'envoyer des commentaires avec la fonction de commentaire sous ma réponse. La fonction la plus appropriée pour cela est pathinfo, c'est pourquoi je n'ai donné basenamequ'une alternative. Il n'est pas nécessaire de réinventer pathinfoavec regex ou explode.
Gordon

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

7

Presque toutes les solutions ci-dessus ont le nom de fichier obtenu à partir de la variable $ path

L'extrait ci-dessous obtiendra le nom du fichier exécuté actuel sans extension

echo pathinfo(basename($_SERVER['SCRIPT_NAME']), PATHINFO_FILENAME);

Explication

$ _SERVER ['SCRIPT_NAME'] contient le chemin du script actuel.



4

@fire incase le nom de fichier utilise des points, vous pourriez obtenir la mauvaise sortie. J'utiliserais la méthode @Gordon mais j'obtiens aussi l'extension, donc la fonction de nom de base fonctionne avec toutes les extensions, comme ceci:

$path = "/home/httpd/html/index.php";
$ext = pathinfo($path, PATHINFO_EXTENSION);

$file = basename($path, ".".$ext); // $file is set to "index"

4

dans mon cas, j'utilise ci-dessous. Je me fiche de son extension. : D je pense que cela vous aidera

$exploded_filepath = explode(".", $filepath_or_URL);
$extension = end($exploded_filepath);
echo basename($filepath_or_URL, ".".$extension ); //will print out the the name without extension.

Btw .: Vous avez une faute de frappe$extenion
Thomas Kekeisen

2

Tu peux écrire ça

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

Ceux-ci renverront l'élément courant du tableau, s'ils ne sont pas utilisés auparavant.


Bonjour, merci de vérifier avant de le rétrograder. Cela fonctionne, je l'avais utilisé plusieurs fois dans mon code. En utilisant cette fonction, vous pouvez obtenir juste un nom de fichier Si votre nom de fichier est "xyz.jpg". Il peut ne pas fonctionner avec des noms de fichiers contenant un chemin complet.
Jitendra Pawar

Cela ne fonctionne pas non plus correctement si un nom de fichier contient plusieurs points, par exemple "some.interesting.image.jpg"
ganzpopp

2

Court

echo pathinfo(__FILE__)['filename']; // since php 5.2

bien. Mais si je mets le code ci-dessus b.phpet que j'exécute a.phpavoir require('b.php'). Ensuite, la sortie sera comment bau lieu dea
Rohan Khude

1

Nom de fichier sans extension de fichier lorsque vous ne connaissez pas cette extension:

$basename = substr($filename, 0, strrpos($filename, "."));


2
Que diriez-vous si l'extension est quelque chose comme .tar.gz?
Arda

1

Si vous ne savez pas de quelle extension vous disposez, vous pouvez essayer ceci:

$ext = strtolower(substr('yourFileName.ext', strrpos('yourFileName.ext', '.') + 1));
echo basename('yourFileName.ext','.'.$ext); // output: "youFileName" only

Travailler avec toutes les possibilités:

image.jpg // output: "image"
filename.image.png // output: "filename.image"
index.php // output: "index"

1

Votre réponse est ci-dessous la solution parfaite pour cacher l'extension de fichier en php.

<?php
    $path = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    echo basename($path, ".php");
?>

1

Les solutions existantes échouent lorsqu'il y a plusieurs parties dans une extension. La fonction ci-dessous fonctionne pour plusieurs parties, un chemin complet ou simplement un nom de fichier:

function removeExt($path)
{
    $basename = basename($path);
    return strpos($basename, '.') === false ? $path : substr($path, 0, - strlen($basename) + strlen(explode('.', $basename)[0]));
}

echo removeExt('https://example.com/file.php');
// https://example.com/file
echo removeExt('https://example.com/file.tar.gz');
// https://example.com/file
echo removeExt('file.tar.gz');
// file
echo removeExt('file');
// file

0

Cela ne renvoie que le nom de fichier sans extension sur 1 ligne:

$path = "/etc/sudoers.php";    
print array_shift(explode(".", basename($path)));
// will print "sudoers"

$file = "file_name.php";    
print array_shift(explode(".", basename($file)));
// will print "file_name"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.