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.
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.
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:
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']);
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
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
also
oznacza, że zadajesz dodatkowe pytanie. Do licha. Niektóre podglądacze dzieci.Odpowiedzi:
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...Bardziej ogólny program do usuwania rozszerzeń plików wyglądałby tak ...
Korzystanie ze standardowych funkcji biblioteki ciągów jest znacznie szybsze , jak można się spodziewać.
źródło
substr
istrrchr
zdjąć ostatnie.
i wszystko za nimi?__FILE__
daje.php
plik 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ń)Jeśli chcesz, aby Twój włącznik wiedział, w jakim pliku się znajduje (tj. W jakiej nazwie skryptu faktycznie zażądano), użyj:
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.
źródło
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Zobacz http://php.net/manual/en/function.pathinfo.php
źródło
Oto różnica między
basename(__FILE__, ".php")
ibasename($_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 .źródło
SCRIPT_FILENAME
lubREQUEST_URI
? Wiem, że oba są zmiennymi serwerowymi, ale czyREQUEST_URI
wartość użytkownika nie jest sfałszowana? umożliwia zagrożenie „wstrzyknięciem URI”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 przypadkuindex
.To może pomóc:
zadziała, nawet jeśli używasz opcji include.
źródło
.php
koniec, którego PO próbował się pozbyćbasename($_SERVER['PHP_SELF'], ".php");
Odpowiedź Alexa jest poprawna, ale możesz to zrobić również bez wyrażeń regularnych:
źródło
hey.php-i-am-a-weird-filename.php
.Oto lista, co znalazłem ostatnio szukając odpowiedzi:
Nie zapomnij usunąć :)
źródło
index.php
obejmuje to,header.php
co z kolei obejmujefunctions.php
, gdzielog_location()
mieszka. Ja nazywamlog_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)? @begoyanmożesz także użyć tego:
źródło
Bardziej ogólnym sposobem byłoby użycie pathinfo () . Od wersji 5.2 obsługuje
PATHINFO_FILENAME
.Więc
zrobi również to, czego potrzebujesz.
źródło
$ argv [0]
Uznałem, że jest o wiele prostszy w użyciu
$argv[0]
. Nazwa skryptu wykonawczego jest zawsze pierwszym elementem w$argv
tablicy. W przeciwieństwie do wszystkich innych metod sugerowanych w innych odpowiedziach, ta metoda nie wymaga użyciabasename()
do usunięcia drzewa katalogów. Na przykład:echo __FILE__;
zwraca coś takiego/my/directory/path/my_script.php
echo $argv[0];
zwrotymy_script.php
źródło
Spróbuj tego
źródło
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:
Wynik:
źródło
źródło
__FILE__
użyj przykładów opartych na wynikach serwera localhost:źródło
Jak niektórzy mówili
basename($_SERVER["SCRIPT_FILENAME"], '.php')
ibasename( __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
źródło