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


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, '.'));
}

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.


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 .


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.


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"]));

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>


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']);

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.


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



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


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

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

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

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.