Ce sont deux questions en une. Lequel voulez-vous savoir. Comment dire le nom du script actuel, comment couper l'extension d'un nom de fichier, ou les deux?
Pekka
3
Le mot alsoindique que vous posez une question supplémentaire. Sheesh. Certains regardent les enfants.
digiscripter
Réponses:
411
Utilisez simplement la constante magique PHP__FILE__ pour obtenir le nom de fichier actuel.
Mais il semble que vous vouliez la partie sans .php. Alors...
basename(__FILE__,'.php');
Un décapant d'extension de fichier plus générique ressemblerait à ceci ...
function chopExtension($filename){return pathinfo($filename, PATHINFO_FILENAME);}
var_dump(chopExtension('bob.php'));// string(3) "bob"
var_dump(chopExtension('bob.i.have.dots.zip'));// string(15) "bob.i.have.dots"
L'utilisation de fonctions de bibliothèque de chaînes standard est beaucoup plus rapide , comme vous vous en doutez.
function chopExtension($filename){return substr($filename,0, strrpos($filename,'.'));}
Pourquoi ne pas simplement utiliser substret strrchrretirer le dernier .et tout ce qui se trouve derrière?
ThiefMaster
9
@ThiefMaster Parce qu'il y a quelque chose de intégré dans PHP pour gérer les extensions de fichiers. La roue existe et roule bien.
alex
2
Mais une expression régulière pourrait être plus chère!
ThiefMaster
14
Bien que __FILE__vous donne le .phpfichier dans lequel se trouve cette ligne, vous voulez en fait $_SERVER['SCRIPT_NAME']le script de niveau supérieur en cours d'exécution (celui qui a été invoqué par le serveur Web ou directement sur la ligne de commande)
Drew Stephens
2
@Drew Je suppose que cela dépend de ce que vous voulez vraiment.
alex
125
Lorsque vous voulez que votre inclusion sache dans quel fichier il se trouve (c'est-à-dire quel nom de script a été réellement demandé), utilisez:
basename($_SERVER["SCRIPT_FILENAME"],'.php')
Parce que lorsque vous écrivez dans un fichier, vous connaissez généralement son nom.
Edit: Comme indiqué par Alec Teal, si vous utilisez des liens symboliques, il affichera le nom du lien symbolique à la place.
Cela m'a été utile)) nécessaire pour obtenir le nom du fichier de script, dans le fichier requis )
Denys Klymenko
4
C'est faux, il n'obtiendra pas le fichier PHP réel, mais le fichier que le serveur Web a résolu à la demande. Différent si vous utilisez des liens SIM.
Alec Teal
Également différent si vous utilisez PHP-FPM.
Andrew Ensley
Aussi, si vous avez également besoin de l'extension, utilisezpathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd
@ c00000fd Si vous avez besoin de l'extension, omettez simplement le deuxième paramètre ...
Voici la différence entre basename(__FILE__, ".php")et basename($_SERVER['REQUEST_URI'], ".php").
basename(__FILE__, ".php")affiche le nom du fichier dans lequel ce code est inclus - Cela signifie que si vous incluez ce code dans header.php et que la page actuelle est index.php , il renverra l'en- tête et non l' index .
basename($_SERVER["REQUEST_URI"], ".php")- Si vous utilisez inclure ce code dans header.php et que la page actuelle est index.php , il renverra l' index et non l'en- tête .
qui est plus sûr SCRIPT_FILENAMEou REQUEST_URI? Je sais qu'ils sont tous les deux des serveurs vars mais n'est-ce pas REQUEST_URIune valeur falsifiée par l'utilisateur? il permet une menace "d'injection d'URI"
SparK
1
les deux ont leur propre impuissance, mais vous pouvez sécuriser votre URL en utilisant différents filers, comme mysql_real_escape_string, stripslashes, etc.
Khandad Niazi
5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");renverra le nom du dossier si le lien est du formulaire http://example.com/somefolder. While basename($_SERVER['PHP_SELF'], ".php");renverra toujours le nom du script, dans ce cas index.
Cela laisse toujours .phpla fin dont le PO tentait de se débarrasser
Brian Leishman
3
@stumpx Alors vous pouvez le fairebasename($_SERVER['PHP_SELF'], ".php");
katalin_2003
J'ai 2 fichiers, header.php et home.php, le header.php est appelé dans home.php comment puis-je détecter dans l'en-tête que la page actuelle est home.php ou contact.php afin que je puisse changer une bannière, etc.
Moxet Khan
19
La réponse d'Alex est correcte mais vous pouvez également le faire sans expressions régulières comme ceci:
Cela court le risque de modifier un nom de fichier comme hey.php-i-am-a-weird-filename.php.
alex
J'y ai déjà pensé, mais j'ai pensé qu'ils l'utilisaient pour la seule page mentionnée dans la question. Vous pouvez également vérifier si le ".php" est à la fin de la chaîne. Ne pas dire que votre question est fausse, mais des expressions régulières peuvent être une sorte de douleur dans le cul et sont généralement utilisées dans des scénarios où une méthode beaucoup plus simple et moins gourmande en ressources pourrait être utilisée.
utilisateur
Shofner J'ai exécuté quelques tests de référence et votre chemin est environ deux fois plus rapide, mais toujours sur 1000 itérations, la différence est de 0,003231 microsecondes.
alex
16
Voici une liste de ce que j'ai trouvé récemment en recherchant une réponse:
//self name with file extension
echo basename(__FILE__).'<br>';//self name without file extension
echo basename(__FILE__,'.php').'<br>';//self full url with file extension
echo __FILE__ .'<br>';//parent file parent folder name
echo basename($_SERVER["REQUEST_URI"]).'<br>';//parent file parent folder name with //s
echo $_SERVER["REQUEST_URI"].'<br>';// parent file name without file extension
echo basename($_SERVER['PHP_SELF'],".php").'<br>';// parent file name with file extension
echo basename($_SERVER['PHP_SELF']).'<br>';// parent file relative url with file etension
echo $_SERVER['PHP_SELF'].'<br>';// parent file name without file extension
echo basename($_SERVER["SCRIPT_FILENAME"],'.php').'<br>';// parent file name with file extension
echo basename($_SERVER["SCRIPT_FILENAME"]).'<br>';// parent file full url with file extension
echo $_SERVER["SCRIPT_FILENAME"].'<br>';//self name without file extension
echo pathinfo(__FILE__, PATHINFO_FILENAME).'<br>';//self file extension
echo pathinfo(__FILE__, PATHINFO_EXTENSION).'<br>';// parent file name with file extension
echo basename($_SERVER['SCRIPT_NAME']);
Alors ... SCRIPT_NAME, SCRIPT_FILENAME et PHP_SELF sont 3 choses différentes, non? (Pourquoi tant de vars de même valeur?! Rasmus était sur la drogue à coup sûr)
SparK
Scénario: index.phpinclut header.phpce qui inclut à son tour functions.php, où log_location()réside. Je l' appelle log_location()dans header.php, puis je lance index.php. Toutes les fonctions ci-dessus impriment soit une fonction, soit un index, soit un domaine, soit une variante de ceux-ci. Je ne veux pas savoir quel script PHP a appelé la fonction. Est-ce même possible (dans une ligne)? @begoyan
Je l'ai trouvé beaucoup plus simple à utiliser $argv[0]. Le nom du script en cours d'exécution est toujours le premier élément du $argvtableau. Contrairement à toutes les autres méthodes suggérées dans d'autres réponses, cette méthode ne nécessite pas l'utilisation de basename()pour supprimer l'arborescence de répertoires. Par exemple:
echo __FILE__; renvoie quelque chose comme /my/directory/path/my_script.php
also
indique que vous posez une question supplémentaire. Sheesh. Certains regardent les enfants.Réponses:
Utilisez simplement la constante magique PHP
__FILE__
pour obtenir le nom de fichier actuel.Mais il semble que vous vouliez la partie sans
.php
. Alors...Un décapant d'extension de fichier plus générique ressemblerait à ceci ...
L'utilisation de fonctions de bibliothèque de chaînes standard est beaucoup plus rapide , comme vous vous en doutez.
la source
substr
etstrrchr
retirer le dernier.
et tout ce qui se trouve derrière?__FILE__
vous donne le.php
fichier dans lequel se trouve cette ligne, vous voulez en fait$_SERVER['SCRIPT_NAME']
le script de niveau supérieur en cours d'exécution (celui qui a été invoqué par le serveur Web ou directement sur la ligne de commande)Lorsque vous voulez que votre inclusion sache dans quel fichier il se trouve (c'est-à-dire quel nom de script a été réellement demandé), utilisez:
Parce que lorsque vous écrivez dans un fichier, vous connaissez généralement son nom.
Edit: Comme indiqué par Alec Teal, si vous utilisez des liens symboliques, il affichera le nom du lien symbolique à la place.
la source
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Voir http://php.net/manual/en/function.pathinfo.php
la source
Voici la différence entre
basename(__FILE__, ".php")
etbasename($_SERVER['REQUEST_URI'], ".php")
.basename(__FILE__, ".php")
affiche le nom du fichier dans lequel ce code est inclus - Cela signifie que si vous incluez ce code dans header.php et que la page actuelle est index.php , il renverra l'en- tête et non l' index .basename($_SERVER["REQUEST_URI"], ".php")
- Si vous utilisez inclure ce code dans header.php et que la page actuelle est index.php , il renverra l' index et non l'en- tête .la source
SCRIPT_FILENAME
ouREQUEST_URI
? Je sais qu'ils sont tous les deux des serveurs vars mais n'est-ce pasREQUEST_URI
une valeur falsifiée par l'utilisateur? il permet une menace "d'injection d'URI"basename($_SERVER["REQUEST_URI"], ".php");
renverra le nom du dossier si le lien est du formulairehttp://example.com/somefolder
. Whilebasename($_SERVER['PHP_SELF'], ".php");
renverra toujours le nom du script, dans ce casindex
.Cela pourrait aider:
cela fonctionnera même si vous utilisez include.
la source
.php
la fin dont le PO tentait de se débarrasserbasename($_SERVER['PHP_SELF'], ".php");
La réponse d'Alex est correcte mais vous pouvez également le faire sans expressions régulières comme ceci:
la source
hey.php-i-am-a-weird-filename.php
.Voici une liste de ce que j'ai trouvé récemment en recherchant une réponse:
N'oubliez pas de supprimer :)
la source
index.php
inclutheader.php
ce qui inclut à son tourfunctions.php
, oùlog_location()
réside. Je l' appellelog_location()
dansheader.php
, puis je lanceindex.php
. Toutes les fonctions ci-dessus impriment soit une fonction, soit un index, soit un domaine, soit une variante de ceux-ci. Je ne veux pas savoir quel script PHP a appelé la fonction. Est-ce même possible (dans une ligne)? @begoyanvous pouvez également utiliser ceci:
la source
Une manière plus générale serait d'utiliser pathinfo () . Depuis la version 5.2, il prend en charge
PATHINFO_FILENAME
.Alors
fera également ce dont vous avez besoin.
la source
$ argv [0]
Je l'ai trouvé beaucoup plus simple à utiliser
$argv[0]
. Le nom du script en cours d'exécution est toujours le premier élément du$argv
tableau. Contrairement à toutes les autres méthodes suggérées dans d'autres réponses, cette méthode ne nécessite pas l'utilisation debasename()
pour supprimer l'arborescence de répertoires. Par exemple:echo __FILE__;
renvoie quelque chose comme/my/directory/path/my_script.php
echo $argv[0];
Retourmy_script.php
la source
Essaye ça
la source
Cela fonctionne pour moi, même lorsqu'il est exécuté dans un fichier PHP inclus, et vous voulez que le nom du fichier php en cours d'exécution soit:
Résultat:
la source
la source
__FILE__
utilisez des exemples basés sur les résultats du serveur localhost:la source
Comme certains l'ont dit
basename($_SERVER["SCRIPT_FILENAME"], '.php')
etbasename( __FILE__, '.php')
sont de bons moyens de tester cela.Pour moi, utiliser le second était la solution pour certaines instructions de validation que je faisais
la source