Dapatkan nama file skrip saat ini


273

Jika saya memiliki skrip PHP, bagaimana saya bisa mendapatkan nama file dari dalam skrip itu?

Juga, mengingat nama skrip formulir jquery.js.php, bagaimana saya bisa mengekstrak hanya bagian "jquery.js"?


1
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, '.'));
}

1
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.


4
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 ...
SparK


56

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:

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

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

Jangan lupa hapus :)

<br>


1
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
s3c

6

Anda juga dapat menggunakan ini:

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

4

Cara yang lebih umum adalah menggunakan pathinfo () . Karena Versi 5.2 mendukung PATHINFO_FILENAME.

Begitu

pathinfo(__FILE__,PATHINFO_FILENAME)

juga akan melakukan apa yang Anda butuhkan.


2

$ argv [0]

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

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



2

Ini berfungsi untuk saya, bahkan ketika dijalankan di dalam file PHP yang disertakan, dan Anda ingin nama file dari file php saat ini berjalan:

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

Hasil:

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__ gunakan contoh berdasarkan hasil server 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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.