Ruft den aktuellen Namen der Skriptdatei ab


273

Wenn ich ein PHP-Skript habe, wie kann ich den Dateinamen aus diesem Skript heraus abrufen?

jquery.js.phpWie kann ich unter Berücksichtigung des Namens eines Skripts des Formulars nur den Teil "jquery.js" extrahieren?


1
Dies sind zwei Fragen in einer. Welches möchten Sie wissen? Wie kann man den Namen des aktuellen Skripts mitteilen, wie man die Erweiterung von einem Dateinamen abschneidet oder beides?
Pekka

3
Das Wort alsozeigt an, dass Sie eine zusätzliche Frage stellen. Meine Güte. Einige gucken Kinder.
Digiscripter

Antworten:


411

Verwenden Sie einfach die magische PHP-Konstante __FILE__ , um den aktuellen Dateinamen zu erhalten.

Aber es scheint, Sie wollen das Teil ohne .php. So...

basename(__FILE__, '.php'); 

Ein allgemeinerer Dateierweiterungsentferner würde so aussehen ...

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"

Die Verwendung von Standardfunktionen der Zeichenfolgenbibliothek ist erwartungsgemäß viel schneller .

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

1
Warum nicht einfach den letzten und alles dahinter verwenden substrund strrchrabstreifen .?
ThiefMaster

9
@ThiefMaster Weil in PHP etwas eingebaut ist, um Dateierweiterungen zu handhaben. Das Rad existiert und rollt gut.
Alex

2
Aber ein Regex könnte teurer sein!
ThiefMaster

14
Während __FILE__Sie die .phpDatei erhalten, in der sich die Zeile befindet, möchten Sie tatsächlich $_SERVER['SCRIPT_NAME']das aktuell ausgeführte Skript der obersten Ebene (das vom Webserver oder direkt in der Befehlszeile aufgerufen wurde)
Drew Stephens

2
@ Draw ich denke das hängt davon ab was du wirklich willst.
alex

125

Wenn Sie möchten, dass Ihr Include weiß, in welcher Datei es sich befindet (dh welcher Skriptname tatsächlich angefordert wurde), verwenden Sie:

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

Denn wenn Sie in eine Datei schreiben, kennen Sie normalerweise deren Namen.

Bearbeiten: Wie von Alec Teal festgestellt, wird bei Verwendung von Symlinks stattdessen der Name des Symlinks angezeigt.


4
Das war hilfreich für mich)) benötigt, um den Namen der Skriptdatei in der erforderlichen Datei zu erhalten )
Denys Klymenko

4
Dies ist falsch, es wird nicht die eigentliche PHP-Datei abgerufen, sondern die Datei, die der Webserver in die Anforderung aufgelöst hat. Anders, wenn Sie Simlinks verwenden.
Alec Teal

Auch anders, wenn Sie PHP-FPM verwenden.
Andrew Ensley

Auch wenn Sie die Erweiterung benötigen, verwenden Siepathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd Wenn Sie die Erweiterung benötigen, lassen Sie einfach den zweiten Parameter
weg


56

Hier ist der Unterschied zwischen basename(__FILE__, ".php")und basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")Zeigt den Namen der Datei an, in der dieser Code enthalten ist. Wenn Sie diesen Code in header.php einfügen und die aktuelle Seite index.php ist , wird der Header und nicht der Index zurückgegeben .

basename($_SERVER["REQUEST_URI"], ".php")- Wenn Sie include this code in header.php verwenden und die aktuelle Seite index.php ist , wird der Index und nicht der Header zurückgegeben .


was ist sicherer SCRIPT_FILENAMEoder REQUEST_URI? Ich weiß, dass beide Server-Variablen sind, aber ist der REQUEST_URIBenutzer keinen manipulierten Wert? es ermöglicht eine "URI-Injektion" Bedrohung
SparK

1
beide haben ihre eigene Impotenz, aber Sie können Ihre URL mit verschiedenen Filern wie mysql_real_escape_string, Stripslashes usw. sichern.
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");gibt den Namen des Ordners zurück, wenn der Link vom Formular ist http://example.com/somefolder. Während basename($_SERVER['PHP_SELF'], ".php");immer zurückkehren den Namen des Skripts, in diesem Fall index.
katalin_2003

27

Dies könnte helfen:

basename($_SERVER['PHP_SELF'])

Es funktioniert auch, wenn Sie include verwenden.


Damit bleibt noch .phpdas Ende, das die OP loswerden wollte
Brian Leishman

3
@stumpx Dann können Sie tunbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Ich habe 2 Dateien, header.php und home.php, die header.php wird in home.php aufgerufen. Wie kann ich im Header erkennen, dass die aktuelle Seite home.php oder contact.php ist, damit ich ein Banner usw. ändern kann?
Moxet Khan

19

Die Antwort von alex ist richtig, aber Sie können dies auch ohne reguläre Ausdrücke wie folgt tun:

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

6
Dies läuft Gefahr, einen Dateinamen wie zu entstellen hey.php-i-am-a-weird-filename.php.
Alex

Ich habe bereits daran gedacht, aber ich dachte, sie würden es für die in der Frage erwähnte einzelne Seite verwenden. Sie können auch überprüfen, ob sich die ".php" am Ende der Zeichenfolge befindet. Nicht zu sagen, dass Ihre Frage falsch ist, aber regelmäßige Espressionen können eine Art Schmerz im Arsch sein und werden normalerweise in Szenarien verwendet, in denen eine viel einfachere und weniger ressourcenintensive Methode verwendet werden könnte.
Benutzer

Shofner Ich habe einige Benchmarks durchgeführt und Ihr Weg läuft ungefähr doppelt so schnell, aber immer noch über 1000 Iterationen beträgt der Unterschied 0,003231 Mikrosekunden.
Alex

16

Hier ist eine Liste, die ich kürzlich gefunden habe, um eine Antwort zu suchen:

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

Vergiss nicht zu entfernen :)

<br>


1
Also ... SCRIPT_NAME, SCRIPT_FILENAME und PHP_SELF sind drei verschiedene Dinge, oder? (Warum so viele Vars mit dem gleichen Wert?! Rasmus war sicher auf Drogen)
SparK

Szenario: index.phpBeinhaltet, header.phpwas wiederum beinhaltet functions.php, wo sich log_location()befindet. Ich rufe log_location()an header.phpund renne dann index.php. Alle oben genannten Funktionen drucken entweder Funktion oder Index oder Domäne oder eine Variation davon aus. Ich möchte nicht wissen, welches PHP-Skript die Funktion aufgerufen hat. Ist es überhaupt möglich (in einem Einzeiler)? @begoyan
s3c

6

Sie können dies auch verwenden:

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

4

Ein allgemeinerer Weg wäre die Verwendung von pathinfo () . Seit Version 5.2 unterstützt es PATHINFO_FILENAME.

Damit

pathinfo(__FILE__,PATHINFO_FILENAME)

wird auch tun, was Sie brauchen.


2

$ argv [0]

Ich fand es viel einfacher zu bedienen $argv[0]. Der Name des ausführenden Skripts ist immer das erste Element im $argvArray. Im Gegensatz zu allen anderen in anderen Antworten vorgeschlagenen Methoden erfordert diese Methode nicht die Verwendung von basename(), um den Verzeichnisbaum zu entfernen. Zum Beispiel:

  • echo __FILE__; gibt so etwas wie zurück /my/directory/path/my_script.php

  • echo $argv[0]; kehrt zurück my_script.php



2

Dies funktioniert bei mir auch dann, wenn es in einer enthaltenen PHP-Datei ausgeführt wird und Sie möchten, dass der Dateiname der aktuellen PHP-Datei ausgeführt wird:

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

Ergebnis:

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__ Verwenden Sie Beispiele basierend auf den Ergebnissen des localhost-Servers:

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

Wie einige sagten basename($_SERVER["SCRIPT_FILENAME"], '.php')und basename( __FILE__, '.php')sind gute Möglichkeiten, dies zu testen.

Für mich war die Verwendung der zweiten die Lösung für einige Validierungsanweisungen, die ich machte

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.