Obtenir le nom du fichier de script actuel

273

Si j'ai un script PHP, comment puis-je obtenir le nom de fichier à l'intérieur de ce script?

De plus, étant donné le nom d'un script du formulaire jquery.js.php, comment puis-je extraire uniquement la partie "jquery.js"?

Alex
la source
1
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, '.'));
}
alex
la source
1
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.

Étincelle
la source
4
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 ...
SparK
56

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 .

Khandad Niazi
la source
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.
katalin_2003
27

Cela pourrait aider:

basename($_SERVER['PHP_SELF'])

cela fonctionnera même si vous utilisez include.

charan315
la source
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:

str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));
utilisateur
la source
6
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']);

N'oubliez pas de supprimer :)

<br>

begoyan
la source
1
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
s3c
6

vous pouvez également utiliser ceci:

echo $pageName = basename($_SERVER['SCRIPT_NAME']);
Shah Alom
la source
4

Une manière plus générale serait d'utiliser pathinfo () . Depuis la version 5.2, il prend en charge PATHINFO_FILENAME.

Alors

pathinfo(__FILE__,PATHINFO_FILENAME)

fera également ce dont vous avez besoin.

Megachip
la source
2

$ 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 $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

  • echo $argv[0]; Retour my_script.php

JBH
la source
2

Essaye ça

$current_file_name = $_SERVER['PHP_SELF'];
echo $current_file_name;

Wakar Ahmad Khan
la source
2

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:

$currentPage= $_SERVER["SCRIPT_NAME"];
$currentPage = substr($currentPage, 1);
echo $currentPage;

Résultat:

index.php

Bolli
la source
0
$filename = "jquery.js.php";
$ext = pathinfo($filename, PATHINFO_EXTENSION);//will output: php
$file_basename = pathinfo($filename, PATHINFO_FILENAME);//will output: jquery.js
Rahul Gupta
la source
0

__FILE__ utilisez des exemples basés sur les résultats du serveur localhost:

echo __FILE__;
// C:\LocalServer\www\templates\page.php

echo strrchr( __FILE__ , '\\' );
// \page.php

echo substr( strrchr( __FILE__ , '\\' ), 1);
// page.php

echo basename(__FILE__, '.php');
// page
Dariusz Sikorski
la source
0

Comme certains l'ont dit basename($_SERVER["SCRIPT_FILENAME"], '.php')et basename( __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

Gendrith
la source