Ini adalah dua pertanyaan dalam satu. Anda ingin tahu yang mana. Bagaimana cara mengetahui nama skrip saat ini, cara memotong ekstensi dari nama file, atau keduanya?
Pekka
3
Kata tersebut alsomenunjukkan bahwa Anda mengajukan pertanyaan tambahan. Sheesh. Beberapa mengintip anak-anak.
digiscripter
Jawaban:
411
Cukup gunakan konstanta sihir PHP__FILE__ untuk mendapatkan nama file saat ini.
Tapi sepertinya Anda menginginkan bagian tanpa .php. Begitu...
basename(__FILE__,'.php');
Penghilang ekstensi file yang lebih umum akan terlihat seperti ini ...
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"
Menggunakan fungsi pustaka string standar jauh lebih cepat , seperti yang Anda harapkan.
function chopExtension($filename){return substr($filename,0, strrpos($filename,'.'));}
Mengapa tidak menggunakan saja substrdan strrchrmelepas yang terakhir .dan semua yang ada di belakangnya?
ThiefMaster
9
@ThiefMaster Karena ada sesuatu yang dibangun dalam PHP untuk menangani ekstensi file. Roda ada, dan berguling dengan baik.
alex
2
Tapi sebuah regex mungkin lebih mahal!
ThiefMaster
14
Sementara __FILE__memberi Anda .phpfile yang barisnya ada, Anda sebenarnya menginginkan $_SERVER['SCRIPT_NAME']skrip tingkat atas yang saat ini berjalan (apa yang dipanggil oleh server web atau langsung di baris perintah)
Drew Stephens
2
@Drew Saya rasa itu tergantung pada apa yang Anda inginkan.
alex
125
Saat Anda ingin agar Anda mengetahui file apa yang ada di dalamnya (mis. Nama skrip apa yang sebenarnya diminta), gunakan:
basename($_SERVER["SCRIPT_FILENAME"],'.php')
Karena ketika Anda menulis ke file Anda biasanya tahu namanya.
Sunting: Seperti dicatat oleh Alec Teal, jika Anda menggunakan symlink, itu akan menampilkan nama symlink.
Itu membantu saya)) diperlukan untuk mendapatkan nama file skrip, dalam file yang diperlukan )
Denys Klymenko
4
Ini salah, itu tidak akan mendapatkan file PHP yang sebenarnya, tetapi file server web diselesaikan dengan permintaan. Berbeda jika Anda menggunakan simlink.
Alec Teal
Juga berbeda jika Anda menggunakan PHP-FPM.
Andrew Ensley
Juga jika Anda memerlukan ekstensi juga, gunakanpathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd
@ c00000fd Jika Anda membutuhkan ekstensi, hilangkan saja parameter kedua ...
Inilah perbedaan antara basename(__FILE__, ".php")dan basename($_SERVER['REQUEST_URI'], ".php").
basename(__FILE__, ".php")memperlihatkan nama file tempat kode ini dimasukkan - Ini artinya jika Anda memasukkan kode ini di header.php dan halaman saat ini adalah index.php , itu akan mengembalikan header bukan indeks .
basename($_SERVER["REQUEST_URI"], ".php")- Jika Anda menggunakan termasuk kode ini di header.php dan halaman saat ini adalah index.php , itu akan mengembalikan indeks bukan header .
mana yang lebih aman SCRIPT_FILENAMEatau REQUEST_URI? Saya tahu mereka berdua vars server tetapi bukankah REQUEST_URInilai pengguna dirusak? itu memungkinkan ancaman "injeksi URI"
SparK
1
keduanya memiliki impotensi mereka sendiri, tetapi Anda dapat mengamankan url Anda menggunakan filer yang berbeda, seperti mysql_real_escape_string, stripslash dll.
Khandad Niazi
5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");akan mengembalikan nama folder jika tautannya berbentuk http://example.com/somefolder. Meskipun basename($_SERVER['PHP_SELF'], ".php");akan selalu mengembalikan nama skrip, dalam hal ini index.
katalin_2003
27
Ini mungkin membantu:
basename($_SERVER['PHP_SELF'])
itu akan berfungsi bahkan jika Anda menggunakan include.
Itu masih menyisakan .phppada akhirnya bahwa OP berusaha untuk menyingkirkan
Brian Leishman
3
@stumpx Kemudian Anda bisa melakukannyabasename($_SERVER['PHP_SELF'], ".php");
katalin_2003
Saya memiliki 2 file, header.php dan home.php, header.php disebut di home.php bagaimana saya bisa mendeteksi di header bahwa halaman saat ini adalah home.php atau contact.php sehingga saya dapat mengubah beberapa banner dll
Moxet Khan
19
Jawaban alex benar, tetapi Anda juga bisa melakukan ini tanpa ekspresi reguler seperti:
Ini berisiko mengambil nama file seperti hey.php-i-am-a-weird-filename.php.
alex
Saya sudah memikirkan itu tetapi saya pikir mereka menggunakannya untuk satu halaman yang disebutkan dalam pertanyaan. Anda juga dapat memeriksa untuk melihat apakah ".php" berada di akhir string. Tidak mengatakan pertanyaan Anda salah, tetapi penindasan yang teratur bisa menjadi masalah di pantat dan biasanya digunakan dalam skenario di mana metode yang jauh lebih sederhana dan lebih intensif sumber daya dapat digunakan.
pengguna
Shofner Saya menjalankan beberapa tolok ukur dan cara Anda berjalan sekitar dua kali lebih cepat, tetapi masih lebih dari 1000 iterasi perbedaannya adalah 0,003231 mikrodetik.
alex
16
Berikut adalah daftar yang baru-baru ini saya temukan sedang mencari jawaban:
//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']);
Jadi ... SCRIPT_NAME, SCRIPT_FILENAME, dan PHP_SELF adalah 3 hal yang berbeda, bukan? (Kenapa begitu banyak vars dengan nilai yang sama ?! Rasmus pasti menggunakan narkoba)
SparK
Skenario: index.phptermasuk header.phpyang pada gilirannya termasuk functions.php, di mana log_location()berada. Saya sebut log_location()di header.php, dan kemudian saya menjalankan index.php. Semua fungsi di atas mencetak salah satu fungsi atau indeks atau domain atau beberapa variasi dari ini. Saya tidak tahu skrip PHP mana yang disebut fungsi. Apakah mungkin (dalam satu garis)? @begoyan
Saya merasa lebih mudah digunakan $argv[0]. Nama skrip yang menjalankan selalu elemen pertama dalam $argvarray. Tidak seperti semua metode lain yang disarankan dalam jawaban lain, metode ini tidak memerlukan penggunaanbasename() untuk menghapus pohon direktori. Sebagai contoh:
echo __FILE__; mengembalikan sesuatu seperti /my/directory/path/my_script.php
also
menunjukkan bahwa Anda mengajukan pertanyaan tambahan. Sheesh. Beberapa mengintip anak-anak.Jawaban:
Cukup gunakan konstanta sihir PHP
__FILE__
untuk mendapatkan nama file saat ini.Tapi sepertinya Anda menginginkan bagian tanpa
.php
. Begitu...Penghilang ekstensi file yang lebih umum akan terlihat seperti ini ...
Menggunakan fungsi pustaka string standar jauh lebih cepat , seperti yang Anda harapkan.
sumber
substr
danstrrchr
melepas yang terakhir.
dan semua yang ada di belakangnya?__FILE__
memberi Anda.php
file yang barisnya ada, Anda sebenarnya menginginkan$_SERVER['SCRIPT_NAME']
skrip tingkat atas yang saat ini berjalan (apa yang dipanggil oleh server web atau langsung di baris perintah)Saat Anda ingin agar Anda mengetahui file apa yang ada di dalamnya (mis. Nama skrip apa yang sebenarnya diminta), gunakan:
Karena ketika Anda menulis ke file Anda biasanya tahu namanya.
Sunting: Seperti dicatat oleh Alec Teal, jika Anda menggunakan symlink, itu akan menampilkan nama symlink.
sumber
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Lihat http://php.net/manual/en/function.pathinfo.php
sumber
Inilah perbedaan antara
basename(__FILE__, ".php")
danbasename($_SERVER['REQUEST_URI'], ".php")
.basename(__FILE__, ".php")
memperlihatkan nama file tempat kode ini dimasukkan - Ini artinya jika Anda memasukkan kode ini di header.php dan halaman saat ini adalah index.php , itu akan mengembalikan header bukan indeks .basename($_SERVER["REQUEST_URI"], ".php")
- Jika Anda menggunakan termasuk kode ini di header.php dan halaman saat ini adalah index.php , itu akan mengembalikan indeks bukan header .sumber
SCRIPT_FILENAME
atauREQUEST_URI
? Saya tahu mereka berdua vars server tetapi bukankahREQUEST_URI
nilai pengguna dirusak? itu memungkinkan ancaman "injeksi URI"basename($_SERVER["REQUEST_URI"], ".php");
akan mengembalikan nama folder jika tautannya berbentukhttp://example.com/somefolder
. Meskipunbasename($_SERVER['PHP_SELF'], ".php");
akan selalu mengembalikan nama skrip, dalam hal iniindex
.Ini mungkin membantu:
itu akan berfungsi bahkan jika Anda menggunakan include.
sumber
.php
pada akhirnya bahwa OP berusaha untuk menyingkirkanbasename($_SERVER['PHP_SELF'], ".php");
Jawaban alex benar, tetapi Anda juga bisa melakukan ini tanpa ekspresi reguler seperti:
sumber
hey.php-i-am-a-weird-filename.php
.Berikut adalah daftar yang baru-baru ini saya temukan sedang mencari jawaban:
Jangan lupa hapus :)
sumber
index.php
termasukheader.php
yang pada gilirannya termasukfunctions.php
, di manalog_location()
berada. Saya sebutlog_location()
diheader.php
, dan kemudian saya menjalankanindex.php
. Semua fungsi di atas mencetak salah satu fungsi atau indeks atau domain atau beberapa variasi dari ini. Saya tidak tahu skrip PHP mana yang disebut fungsi. Apakah mungkin (dalam satu garis)? @begoyanAnda juga dapat menggunakan ini:
sumber
Cara yang lebih umum adalah menggunakan pathinfo () . Karena Versi 5.2 mendukung
PATHINFO_FILENAME
.Begitu
juga akan melakukan apa yang Anda butuhkan.
sumber
$ argv [0]
Saya merasa lebih mudah digunakan
$argv[0]
. Nama skrip yang menjalankan selalu elemen pertama dalam$argv
array. Tidak seperti semua metode lain yang disarankan dalam jawaban lain, metode ini tidak memerlukan penggunaanbasename()
untuk menghapus pohon direktori. Sebagai contoh:echo __FILE__;
mengembalikan sesuatu seperti/my/directory/path/my_script.php
echo $argv[0];
kembalimy_script.php
sumber
Coba ini
sumber
Ini berfungsi untuk saya, bahkan ketika dijalankan di dalam file PHP yang disertakan, dan Anda ingin nama file dari file php saat ini berjalan:
Hasil:
sumber
sumber
__FILE__
gunakan contoh berdasarkan hasil server localhost:sumber
Seperti yang dikatakan
basename($_SERVER["SCRIPT_FILENAME"], '.php')
danbasename( __FILE__, '.php')
ada cara yang baik untuk menguji ini.Bagi saya menggunakan yang kedua adalah solusi untuk beberapa instruksi validasi yang saya buat
sumber