Lấy tên tập tin kịch bản hiện tại


273

Nếu tôi có tập lệnh PHP, làm cách nào tôi có thể lấy tên tệp từ bên trong tập lệnh đó?

Ngoài ra, được đặt tên của một tập lệnh của biểu mẫu jquery.js.php, làm cách nào tôi có thể trích xuất phần "jquery.js"?


1
Đây là hai câu hỏi trong một. Cái nào bạn muốn biết. Làm cách nào để biết tên tập lệnh hiện tại, cách cắt phần mở rộng khỏi tên tệp hoặc cả hai?
Pekka

3
Từ alsocho biết bạn đang hỏi một câu hỏi bổ sung. Sheesh. Một số trẻ em nhìn trộm.
đào

Câu trả lời:


411

Chỉ cần sử dụng hằng số ma thuật PHP __FILE__ để có được tên tệp hiện tại.

Nhưng có vẻ như bạn muốn phần mà không có .php. Vì thế...

basename(__FILE__, '.php'); 

Một loại bỏ phần mở rộng tập tin chung hơn sẽ trông như thế này ...

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"

Sử dụng các hàm thư viện chuỗi tiêu chuẩn nhanh hơn nhiều , như bạn mong đợi.

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

1
Tại sao không chỉ đơn giản là sử dụng substrstrrchrtước bỏ cuối cùng .và mọi thứ đằng sau nó?
ThiefMaster

9
@ThiefMaster Vì có một cái gì đó được tích hợp trong PHP để xử lý các phần mở rộng tệp. Bánh xe tồn tại, và lăn tốt.
alex

2
Nhưng một regex có thể đắt hơn!
ThiefMaster

14
Trong khi __FILE__cung cấp cho bạn .phptệp có dòng, bạn thực sự muốn $_SERVER['SCRIPT_NAME']tập lệnh cấp cao nhất hiện đang chạy (được máy chủ web gọi hoặc trực tiếp trên dòng lệnh)
Drew Stephens

2
@Drew Tôi đoán điều đó phụ thuộc vào những gì bạn thực sự muốn.
alex

125

Khi bạn muốn bao gồm của bạn để biết nó nằm trong tập tin nào (ví dụ: tên tập lệnh nào thực sự được yêu cầu), hãy sử dụng:

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

Bởi vì khi bạn viết vào một tập tin, bạn thường biết tên của nó.

Chỉnh sửa: Theo ghi nhận của Alec Teal, nếu bạn sử dụng symlink, nó sẽ hiển thị tên symlink thay thế.


4
Điều đó hữu ích với tôi)) cần thiết để có được tên tệp tập lệnh, trong tệp yêu cầu )
Denys Klymenko

4
Điều này là sai, nó sẽ không nhận được tệp PHP thực sự, nhưng tệp máy chủ web đã giải quyết theo yêu cầu. Khác nhau nếu bạn sử dụng simlinks.
Alec Teal

Cũng khác nhau nếu bạn sử dụng PHP-FPM.
Andrew Oblley

Ngoài ra nếu bạn cũng cần tiện ích mở rộng, hãy sử dụngpathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd Nếu bạn cần tiện ích mở rộng, hãy bỏ qua tham số thứ hai ...
SparK


56

Đây là sự khác biệt giữa basename(__FILE__, ".php")basename($_SERVER['REQUEST_URI'], ".php").

basename(__FILE__, ".php")hiển thị tên của tệp chứa mã này - Điều đó có nghĩa là nếu bạn đưa mã này vào tiêu đề.php và trang hiện tại là index.php , nó sẽ trả về tiêu đề không phải là chỉ mục .

basename($_SERVER["REQUEST_URI"], ".php")- Nếu bạn sử dụng bao gồm mã này trong header.php và trang hiện tại là index.php , nó sẽ trả về chỉ mục không phải tiêu đề .


đó là an toàn hơn SCRIPT_FILENAMEhay REQUEST_URI? Tôi biết cả hai đều là máy chủ nhưng không phải REQUEST_URIlà giá trị giả mạo người dùng? nó cho phép mối đe dọa "tiêm URI"
SparK

1
cả hai đều có sự bất lực của riêng mình, nhưng bạn có thể bảo vệ url của mình bằng cách sử dụng các trình quay khác nhau, như mysql_real_escape_opes, thoát y, v.v.
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");sẽ trả lại tên của thư mục nếu liên kết có dạng http://example.com/somefolder. Trong khi basename($_SERVER['PHP_SELF'], ".php");sẽ luôn trả lại tên của tập lệnh, trong trường hợp này index.
katalin_2003

27

Điều này có thể giúp:

basename($_SERVER['PHP_SELF'])

nó sẽ hoạt động ngay cả khi bạn đang sử dụng bao gồm.


Điều đó vẫn để lại .phpkết cục mà OP đang cố gắng loại bỏ
Brian Leishman

3
@stumpx Sau đó, bạn có thể làmbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

Tôi có 2 tệp, header.php và home.php, tiêu đề.php được gọi trong home.php làm thế nào tôi có thể phát hiện trong tiêu đề rằng trang hiện tại là home.php hoặc contact.php để tôi có thể thay đổi một số biểu ngữ, v.v.
Moxet Khan

19

Câu trả lời của alex là đúng nhưng bạn cũng có thể làm điều này mà không cần biểu thức chính quy như vậy:

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

6
Điều này có nguy cơ xáo trộn một tên tệp như hey.php-i-am-a-weird-filename.php.
alex

Tôi đã nghĩ về điều đó nhưng tôi đoán họ đang sử dụng nó cho một trang được đề cập trong câu hỏi. Bạn cũng có thể kiểm tra xem ".php" có ở cuối chuỗi không. Không nói câu hỏi của bạn là sai nhưng việc bỏ qua thường xuyên có thể là một nỗi đau ở mông và thường được sử dụng trong các tình huống trong đó phương pháp đơn giản hơn và ít sử dụng tài nguyên hơn có thể được sử dụng.
người dùng

Shofner Tôi đã chạy một số điểm chuẩn và cách của bạn chạy nhanh gấp đôi, nhưng vẫn hơn 1000 lần lặp, sự khác biệt là 0,003231 micro giây.
alex

16

Đây là danh sách những gì tôi tìm thấy gần đây khi tìm kiếm câu trả lời:

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

Đừng quên xóa :)

<br>


1
Vậy ... SCRIPT_NAME, SCRIPT_FILENAME và PHP_SELF là 3 thứ khác nhau, phải không? (Tại sao rất nhiều lọ có cùng giá trị?! Rasmus chắc chắn đã sử dụng thuốc)
SparK

Kịch bản: index.phpbao gồm header.phplần lượt bao gồm functions.php, nơi log_location()cư trú. Tôi gọi log_location()trong header.php, và sau đó tôi chạy index.php. Tất cả các chức năng trên in ra chức năng hoặc chỉ mục hoặc tên miền hoặc một số biến thể của các chức năng này. Tôi sẽ không biết kịch bản PHP nào được gọi là hàm. Nó thậm chí có thể (trong một lót)? @begoyan
s3c

6

bạn cũng có thể sử dụng cái này:

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

4

Một cách tổng quát hơn sẽ là sử dụng pathinfo () . Kể từ phiên bản 5.2, nó hỗ trợ PATHINFO_FILENAME.

Vì thế

pathinfo(__FILE__,PATHINFO_FILENAME)

cũng sẽ làm những gì bạn cần


2

$ argv [0]

Tôi đã tìm thấy nó đơn giản hơn nhiều để sử dụng $argv[0]. Tên của tập lệnh thực thi luôn là phần tử đầu tiên trong $argvmảng. Không giống như tất cả các phương thức khác được đề xuất trong các câu trả lời khác, phương pháp này không yêu cầu sử dụng basename()để loại bỏ cây thư mục. Ví dụ:

  • echo __FILE__; trả lại một cái gì đó như /my/directory/path/my_script.php

  • echo $argv[0]; trả lại my_script.php



2

Điều này hoạt động với tôi, ngay cả khi chạy bên trong tệp PHP được bao gồm và bạn muốn tên tệp của tệp php hiện tại đang chạy:

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

Kết quả:

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__ sử dụng các ví dụ dựa trên kết quả máy chủ 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

Như một số người đã nói basename($_SERVER["SCRIPT_FILENAME"], '.php')basename( __FILE__, '.php')là những cách tốt để kiểm tra điều này.

Đối với tôi, sử dụng thứ hai là giải pháp cho một số hướng dẫn xác thực tôi đang thực hiện

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.