Ottieni il nome del file di script corrente


273

Se ho uno script PHP, come posso ottenere il nome file da quello script?

Inoltre, dato il nome di uno script del modulo jquery.js.php, come posso estrarre solo la parte "jquery.js"?


1
Queste sono due domande in una. Quale vuoi sapere. Come dire il nome dello script corrente, come tagliare l'estensione da un nome di file o entrambi?
Pekka,

3
La parola alsoindica che stai facendo una domanda aggiuntiva. Sheesh. Alcuni fanno capolino i bambini.
digiscripter

Risposte:


411

Basta usare la costante magica PHP __FILE__ per ottenere il nome del file corrente.

Ma sembra che tu voglia la parte senza .php. Così...

basename(__FILE__, '.php'); 

Un dispositivo di rimozione di estensioni di file più generico sarebbe simile a questo ...

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'uso delle funzioni standard della libreria di stringhe è molto più rapido , come ci si aspetterebbe.

function chopExtension($filename) {
    return substr($filename, 0, strrpos($filename, '.'));
}

1
Perché non semplicemente usare substre strrchrtogliere l'ultimo .e tutto ciò che sta dietro?
ThiefMaster,

9
@ThiefMaster Perché c'è qualcosa incorporato in PHP per gestire le estensioni dei file. La ruota esiste e ruota bene.
alex

2
Ma una regex potrebbe essere più costosa!
ThiefMaster,

14
Mentre __FILE__ti dà il .phpfile in cui si trova la riga, in realtà vuoi $_SERVER['SCRIPT_NAME']lo script di livello superiore attualmente in esecuzione (quello che è stato invocato dal server web o direttamente dalla riga di comando)
Drew Stephens,

2
@Drew Immagino che dipende da cosa vuoi davvero.
alex,

125

Quando vuoi che la tua inclusione sappia in quale file si trova (cioè quale nome dello script è stato effettivamente richiesto), usa:

basename($_SERVER["SCRIPT_FILENAME"], '.php')

Perché quando si scrive su un file di solito si conosce il suo nome.

Modifica: come notato da Alec Teal, se si utilizzano i collegamenti simbolici mostrerà invece il nome del collegamento simbolico.


4
Mi è stato utile)) necessario per ottenere il nome del file di script, nel file richiesto )
Denys Klymenko,

4
Questo è sbagliato, non otterrà il file PHP effettivo, ma il file che il server web ha risolto alla richiesta. Diverso se si utilizzano i simlink.
Alec Teal,

Diverso anche se usi PHP-FPM.
Andrew Ensley,

Inoltre, se hai bisogno anche dell'estensione, usapathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd il

@ c00000fd Se hai bisogno dell'estensione ometti il ​​secondo parametro ...
SparK


56

Ecco la differenza tra basename(__FILE__, ".php")e basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")mostra il nome del file in cui è incluso questo codice - Significa che se includi questo codice in header.php e la pagina corrente è index.php , restituirà header non index .

basename($_SERVER["REQUEST_URI"], ".php")- Se usi includi questo codice in header.php e la pagina corrente è index.php , restituirà index non header .


quale è più sicuro SCRIPT_FILENAMEo REQUEST_URI? So che entrambi sono server vars ma non è REQUEST_URIun valore manomesso dall'utente? abilita una minaccia di "iniezione di URI"
SparK

1
entrambi hanno la propria impotenza, ma puoi proteggere il tuo url usando diversi filer, come mysql_real_escape_string, striplashes ecc.
Khandad Niazi,

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");restituirà il nome della cartella se il collegamento è nel modulo http://example.com/somefolder. Mentre basename($_SERVER['PHP_SELF'], ".php");restituirà sempre il nome dello script, in questo caso index.
katalin_2003,

27

Questo potrebbe aiutare:

basename($_SERVER['PHP_SELF'])

funzionerà anche se stai usando include.


Che lascia ancora il .phpalla fine che il PO stava cercando di sbarazzarsi di
Brian Leishman

3
@stumpx Allora puoi farlobasename($_SERVER['PHP_SELF'], ".php");
katalin_2003,

Ho 2 file, header.php e home.php, il header.php è chiamato in home.php come posso rilevare nell'intestazione che la pagina corrente è home.php o contact.php in modo da poter cambiare qualche banner ecc.
Moxet Khan,

19

la risposta di alex è corretta, ma potresti farlo anche senza espressioni regolari in questo modo:

str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));

6
Questo corre il rischio di alterare un nome di file come hey.php-i-am-a-weird-filename.php.
alex

Ci avevo già pensato, ma ho pensato che lo stessero usando per la singola pagina menzionata nella domanda. Puoi anche verificare se ".php" è alla fine della stringa. Non dire che la tua domanda è sbagliata, ma le espressioni regolari possono essere una sorta di dolore nel culo e di solito vengono utilizzate in scenari in cui potrebbe essere utilizzato un metodo molto più semplice e meno dispendioso in termini di risorse.
utente

Shofner ho eseguito alcuni benchmark e la tua strada è circa il doppio più veloce, ma comunque oltre 1000 iterazioni la differenza è di 0,003231 microsecondi.
alex

16

Ecco un elenco di quello che ho trovato di recente cercando una risposta:

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

Non dimenticare di rimuovere :)

<br>


1
Quindi ... SCRIPT_NAME, SCRIPT_FILENAME e PHP_SELF sono 3 cose diverse, giusto? (Perché così tanti vars con lo stesso valore ?! Rasmus era sicuramente
drogato

Scenario: index.phpinclude ciò header.phpche a sua volta include functions.php, dove log_location()risiede. Chiamo log_location()in header.php, e poi corro index.php. Tutte le funzioni di cui sopra stampano la funzione o l'indice o il dominio o alcune varianti di questi. Non voglio sapere quale script PHP ha chiamato la funzione. È anche possibile (in una linea)? @begoyan
s3c,

6

puoi anche usare questo:

echo $pageName = basename($_SERVER['SCRIPT_NAME']);

4

Un modo più generale sarebbe usare pathinfo () . Dalla versione 5.2 supporta PATHINFO_FILENAME.

Così

pathinfo(__FILE__,PATHINFO_FILENAME)

farà anche ciò di cui hai bisogno.


2

$ Argv [0]

L'ho trovato molto più semplice da usare $argv[0]. Il nome dello script in esecuzione è sempre il primo elemento $argvdell'array. A differenza di tutti gli altri metodi suggeriti in altre risposte, questo metodo non richiede l'uso di basename()per rimuovere l'albero delle directory. Per esempio:

  • echo __FILE__; restituisce qualcosa di simile /my/directory/path/my_script.php

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



2

Questo funziona per me, anche quando eseguito all'interno di un file PHP incluso, e vuoi che il nome del file php corrente sia in esecuzione:

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

Risultato:

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__ utilizzare esempi basati sui risultati del server 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

Come alcuni hanno detto basename($_SERVER["SCRIPT_FILENAME"], '.php')e basename( __FILE__, '.php')sono buoni modi per testarlo.

Per me usare il secondo è stata la soluzione per alcune istruzioni di validazione che stavo facendo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.