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.

Mostafa Elkady
la source

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
Czechnology
la source
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.

Gordon
la source
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

yckart
la source
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.

caiosm1005
la source
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

anydasa
la source
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));
Feu
la source
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.

Rohan Khude
la source
7

Il n'est pas nécessaire d'écrire beaucoup de code. Même cela peut être fait par une seule ligne de code. Voir ici

Ci-dessous se trouve le code d'une ligne qui renvoie uniquement le nom de fichier et supprime le nom de l'extension:

<?php
 echo pathinfo('logo.png')['filename'];
?>

Il imprimera

logo

Source: Supprimer l'extension et renvoyer uniquement le nom de fichier en PHP

Faruque Ahamed Mollick
la source
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"
NSINE
la source
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.
Hoàng Vũ Tgtt
la source
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.

Jitendra Pawar
la source
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
mariovials
la source
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, "."));

user2047861
la source
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"
Ghanshyam Gohel
la source
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");
?>
shaz3e
la source
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
Dan Bray
la source
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"
Vincenzo Ruffa
la source