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"
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.
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
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.
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:
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']);
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
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
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:
also
zeigt an, dass Sie eine zusätzliche Frage stellen. Meine Güte. Einige gucken Kinder.Antworten:
Verwenden Sie einfach die magische PHP-Konstante
__FILE__
, um den aktuellen Dateinamen zu erhalten.Aber es scheint, Sie wollen das Teil ohne
.php
. So...Ein allgemeinerer Dateierweiterungsentferner würde so aussehen ...
Die Verwendung von Standardfunktionen der Zeichenfolgenbibliothek ist erwartungsgemäß viel schneller .
quelle
substr
undstrrchr
abstreifen.
?__FILE__
Sie die.php
Datei 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)Wenn Sie möchten, dass Ihr Include weiß, in welcher Datei es sich befindet (dh welcher Skriptname tatsächlich angefordert wurde), verwenden Sie:
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.
quelle
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Siehe http://php.net/manual/en/function.pathinfo.php
quelle
Hier ist der Unterschied zwischen
basename(__FILE__, ".php")
undbasename($_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 .quelle
SCRIPT_FILENAME
oderREQUEST_URI
? Ich weiß, dass beide Server-Variablen sind, aber ist derREQUEST_URI
Benutzer keinen manipulierten Wert? es ermöglicht eine "URI-Injektion" Bedrohungbasename($_SERVER["REQUEST_URI"], ".php");
gibt den Namen des Ordners zurück, wenn der Link vom Formular isthttp://example.com/somefolder
. Währendbasename($_SERVER['PHP_SELF'], ".php");
immer zurückkehren den Namen des Skripts, in diesem Fallindex
.Dies könnte helfen:
Es funktioniert auch, wenn Sie include verwenden.
quelle
.php
das Ende, das die OP loswerden wolltebasename($_SERVER['PHP_SELF'], ".php");
Die Antwort von alex ist richtig, aber Sie können dies auch ohne reguläre Ausdrücke wie folgt tun:
quelle
hey.php-i-am-a-weird-filename.php
.Hier ist eine Liste, die ich kürzlich gefunden habe, um eine Antwort zu suchen:
Vergiss nicht zu entfernen :)
quelle
index.php
Beinhaltet,header.php
was wiederum beinhaltetfunctions.php
, wo sichlog_location()
befindet. Ich rufelog_location()
anheader.php
und renne dannindex.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)? @begoyanSie können dies auch verwenden:
quelle
Ein allgemeinerer Weg wäre die Verwendung von pathinfo () . Seit Version 5.2 unterstützt es
PATHINFO_FILENAME
.Damit
wird auch tun, was Sie brauchen.
quelle
$ argv [0]
Ich fand es viel einfacher zu bedienen
$argv[0]
. Der Name des ausführenden Skripts ist immer das erste Element im$argv
Array. Im Gegensatz zu allen anderen in anderen Antworten vorgeschlagenen Methoden erfordert diese Methode nicht die Verwendung vonbasename()
, 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ückmy_script.php
quelle
Versuche dies
quelle
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:
Ergebnis:
quelle
quelle
__FILE__
Verwenden Sie Beispiele basierend auf den Ergebnissen des localhost-Servers:quelle
Wie einige sagten
basename($_SERVER["SCRIPT_FILENAME"], '.php')
undbasename( __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
quelle