Uzyskaj bieżącą nazwę pliku skryptu


273

Jeśli mam skrypt PHP, jak mogę uzyskać nazwę pliku z tego skryptu?

Ponadto, biorąc pod uwagę nazwę skryptu formularza jquery.js.php, jak mogę wyodrębnić tylko część „jquery.js”?


1
To dwa pytania w jednym. Który chcesz wiedzieć? Jak podać nazwę bieżącego skryptu, jak odciąć rozszerzenie od nazwy pliku lub oba?
Pekka

3
Słowo alsooznacza, że ​​zadajesz dodatkowe pytanie. Do licha. Niektóre podglądacze dzieci.
digiscripter

Odpowiedzi:


411

Wystarczy użyć stałej magicznej PHP, __FILE__ aby uzyskać bieżącą nazwę pliku.

Ale wydaje się, że chcesz tę część bez .php. Więc...

basename(__FILE__, '.php'); 

Bardziej ogólny program do usuwania rozszerzeń plików wyglądałby tak ...

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"

Korzystanie ze standardowych funkcji biblioteki ciągów jest znacznie szybsze , jak można się spodziewać.

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

1
Dlaczego nie po prostu użyć substri strrchrzdjąć ostatnie .i wszystko za nimi?
ThiefMaster

9
@ ThiefMaster Ponieważ w PHP jest coś wbudowanego do obsługi rozszerzeń plików. Koło istnieje i dobrze się toczy.
alex

2
Ale wyrażenie regularne może być droższe!
ThiefMaster,

14
Choć __FILE__daje .phpplik linia jest, rzeczywiście chcesz $_SERVER['SCRIPT_NAME']do aktualnie uruchomionego skryptu najwyższego poziomu (ten, który został wywołany przez serwer WWW lub bezpośrednio z linii poleceń)
Drew Stephens

2
@Drew Myślę, że to zależy od tego, czego naprawdę chcesz.
alex

125

Jeśli chcesz, aby Twój włącznik wiedział, w jakim pliku się znajduje (tj. W jakiej nazwie skryptu faktycznie zażądano), użyj:

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

Ponieważ kiedy piszesz do pliku, zwykle znasz jego nazwę.

Edycja: Jak zauważył Alec Teal, jeśli użyjesz dowiązań symbolicznych, wyświetli się nazwa dowiązania symbolicznego.


4
To mi
pomogło

4
To źle, nie otrzyma rzeczywistego pliku PHP, ale plik rozwiązany przez serwer WWW na żądanie. Inaczej, jeśli używasz linków SIM
Alec Teal

Różni się również, jeśli używasz PHP-FPM.
Andrew Ensley,

Również, jeśli potrzebujesz rozszerzenia, użyjpathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd Jeśli potrzebujesz rozszerzenia, pomiń drugi parametr ...
SparK


56

Oto różnica między basename(__FILE__, ".php")i basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")pokazuje nazwę pliku, w którym znajduje się ten kod - Oznacza to, że jeśli umieścisz ten kod w header.php, a bieżąca strona to index.php , zwróci nagłówek, a nie indeks .

basename($_SERVER["REQUEST_URI"], ".php")- Jeśli użyjesz dołączenia tego kodu do header.php, a bieżąca strona to index.php , zwróci indeks, a nie nagłówek .


który jest bezpieczniejszy SCRIPT_FILENAMElub REQUEST_URI? Wiem, że oba są zmiennymi serwerowymi, ale czy REQUEST_URIwartość użytkownika nie jest sfałszowana? umożliwia zagrożenie „wstrzyknięciem URI”
SparK

1
oba mają swoją impotencję, ale możesz zabezpieczyć swój adres URL za pomocą różnych filtrów, takich jak mysql_real_escape_string, stripslashes itp.
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");zwróci nazwę folderu, jeśli link ma formę http://example.com/somefolder. Chociaż basename($_SERVER['PHP_SELF'], ".php");zawsze zwróci nazwę skryptu, w tym przypadku index.
katalin_2003

27

To może pomóc:

basename($_SERVER['PHP_SELF'])

zadziała, nawet jeśli używasz opcji include.


To wciąż pozostawia .phpkoniec, którego PO próbował się pozbyć
Brian Leishman

3
@stumpx Więc możesz zrobićbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Mam 2 pliki, header.php i home.php, header.php jest wywoływany w home.php, jak mogę wykryć w nagłówku, że bieżąca strona to home.php lub contact.php, więc mogę zmienić baner itp.
Moxet Khan

19

Odpowiedź Alexa jest poprawna, ale możesz to zrobić również bez wyrażeń regularnych:

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

6
Grozi to zmanipulowaniem nazwy pliku takiej jak hey.php-i-am-a-weird-filename.php.
alex

Już o tym myślałem, ale pomyślałem, że używają go do pojedynczej strony wymienionej w pytaniu. Możesz także sprawdzić, czy „.php” znajduje się na końcu ciągu. Nie mówię, że twoje pytanie jest błędne, ale regularne wypowiedzi mogą być uciążliwe i są zwykle stosowane w scenariuszach, w których można zastosować znacznie prostszą i mniej zasobochłonną metodę.
użytkownik

Shofner Przebiegłem kilka testów, a twoja droga biegnie około dwa razy szybciej, ale wciąż ponad 1000 iteracji różnica wynosi 0,003231 mikrosekund.
alex

16

Oto lista, co znalazłem ostatnio szukając odpowiedzi:

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

Nie zapomnij usunąć :)

<br>


1
Więc ... SCRIPT_NAME, SCRIPT_FILENAME i PHP_SELF to 3 różne rzeczy, prawda? (Dlaczego tak wiele samochodów o tej samej wartości ?! Rasmus na pewno
brał

Scenariusz: index.phpobejmuje to, header.phpco z kolei obejmuje functions.php, gdzie log_location()mieszka. Ja nazywam log_location()się header.php, a następnie uruchomić index.php. Wszystkie powyższe funkcje wypisują albo funkcję, albo indeks, albo domenę albo niektóre ich odmiany. Nie wiem, który skrypt PHP wywołał tę funkcję. Czy to w ogóle możliwe (w jednej linijce)? @begoyan
s3c

6

możesz także użyć tego:

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

4

Bardziej ogólnym sposobem byłoby użycie pathinfo () . Od wersji 5.2 obsługuje PATHINFO_FILENAME.

Więc

pathinfo(__FILE__,PATHINFO_FILENAME)

zrobi również to, czego potrzebujesz.


2

$ argv [0]

Uznałem, że jest o wiele prostszy w użyciu $argv[0]. Nazwa skryptu wykonawczego jest zawsze pierwszym elementem w $argvtablicy. W przeciwieństwie do wszystkich innych metod sugerowanych w innych odpowiedziach, ta metoda nie wymaga użycia basename()do usunięcia drzewa katalogów. Na przykład:

  • echo __FILE__; zwraca coś takiego /my/directory/path/my_script.php

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



2

Działa to dla mnie, nawet jeśli działa w dołączonym pliku PHP i chcesz, aby nazwa bieżącego pliku php była uruchomiona:

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

Wynik:

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__ użyj przykładów opartych na wynikach serwera 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

Jak niektórzy mówili basename($_SERVER["SCRIPT_FILENAME"], '.php')i basename( __FILE__, '.php')są to dobre sposoby na przetestowanie tego.

Dla mnie użycie drugiego było rozwiązaniem dla niektórych instrukcji sprawdzania poprawności, które tworzyłem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.