รับชื่อไฟล์สคริปต์ปัจจุบัน


273

หากฉันมีสคริปต์ PHP ฉันจะได้ชื่อไฟล์จากภายในสคริปต์นั้นได้อย่างไร

นอกจากนี้ด้วยชื่อของสคริปต์ของฟอร์มjquery.js.phpฉันจะแยกส่วน "jquery.js" ได้อย่างไร


1
นี่คือคำถามสองข้อในข้อเดียว คุณอยากรู้ว่าอันไหน จะบอกชื่อสคริปต์ปัจจุบันได้อย่างไรวิธีตัดส่วนขยายออกจากชื่อไฟล์หรือทั้งสองอย่าง
Pekka

3
คำนี้alsoระบุว่าคุณกำลังถามคำถามเพิ่มเติม Sheesh เด็กบางคนแอบมอง
digiscripter

คำตอบ:


411

เพียงแค่ใช้ค่าคงที่เวทย์มนตร์ PHP __FILE__เพื่อรับชื่อไฟล์ปัจจุบัน

.phpแต่ดูเหมือนว่าคุณต้องการเป็นส่วนหนึ่งโดยไม่ต้อง ดังนั้น...

basename(__FILE__, '.php'); 

ตัวถอดนามสกุลไฟล์ทั่วไปจะมีลักษณะเช่นนี้ ...

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"

การใช้ฟังก์ชันไลบรารีสตริงมาตรฐานนั้นเร็วกว่ามากตามที่คุณคาดหวัง

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

1
ทำไมไม่เพียงแค่ใช้substrและstrrchrถอดออกจากสิ่งสุดท้าย.และทุกสิ่งที่อยู่ด้านหลัง
ThiefMaster

9
@ThiefMaster เพราะมีบางสิ่งในตัว PHP ที่จะรองรับนามสกุลไฟล์ ล้อมีอยู่และม้วนได้ดี
alex

2
แต่ regex อาจมีราคาแพงกว่า!
ThiefMaster

14
ในขณะที่__FILE__ให้.phpไฟล์ที่อยู่ในบรรทัดคุณต้องการ$_SERVER['SCRIPT_NAME']สคริปต์ระดับบนสุดที่ทำงานอยู่ในปัจจุบัน (ซึ่งถูกเรียกโดยเว็บเซิร์ฟเวอร์หรือบนบรรทัดคำสั่งโดยตรง)
Drew Stephens

2
@ ดึงฉันเดาว่าขึ้นอยู่กับสิ่งที่คุณต้องการจริงๆ
alex

125

เมื่อคุณต้องการให้ไฟล์ของคุณรวมอยู่ในไฟล์ใด (เช่นชื่อไฟล์ที่ร้องขอจริง) ให้ใช้:

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

เพราะเมื่อคุณเขียนไฟล์คุณมักจะรู้ชื่อของมัน

แก้ไข: ตามที่ระบุไว้โดย Alec Teal หากคุณใช้ symlink จะแสดงชื่อ symlink แทน


4
ที่เป็นประโยชน์กับผม)) ที่จำเป็นเพื่อให้ได้ชื่อไฟล์สคริปต์ในไฟล์ที่ต้องการ )
เด Klymenko

4
นี่เป็นความผิดพลาดมันจะไม่ได้รับไฟล์ PHP จริง แต่ไฟล์ที่เว็บเซิร์ฟเวอร์แก้ไขตามคำขอ แตกต่างกันถ้าคุณใช้ simlinks
Alec Teal

แตกต่างกันหากคุณใช้ PHP-FPM
Andrew Ensley

นอกจากนี้หากคุณต้องการส่วนขยายด้วยให้ใช้pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd หากคุณต้องการส่วนขยายเพียงแค่ละเว้นพารามิเตอร์ตัวที่สอง ...
SparK


56

นี่คือความแตกต่างระหว่างและbasename(__FILE__, ".php")basename($_SERVER['REQUEST_URI'], ".php")

basename(__FILE__, ".php")แสดงให้เห็นว่าชื่อของไฟล์ที่รหัสนี้จะรวมอยู่ - มันหมายความว่าถ้าคุณใส่รหัสนี้ในheader.phpหน้าปัจจุบันคือindex.phpก็จะกลับหัวไม่ดัชนี

basename($_SERVER["REQUEST_URI"], ".php")- ถ้าคุณใช้รวมถึงโค้ดนี้ในheader.php หน้าปัจจุบันคือindex.phpก็จะกลับดัชนีไม่ได้ส่วนหัว


ซึ่งจะปลอดภัยกว่าSCRIPT_FILENAMEหรือREQUEST_URI? ฉันรู้ว่าพวกเขาทั้งสองเป็น vars เซิร์ฟเวอร์ แต่REQUEST_URIผู้ใช้ไม่ได้แก้ไขค่าหรือไม่ มันช่วยให้ "ฉีด URI" ภัยคุกคาม
SPARK

1
ทั้งคู่มีความอ่อนแอของตัวเอง แต่คุณสามารถรักษา URL ของคุณให้ปลอดภัยโดยใช้ฟิลเตอร์ที่แตกต่างกันเช่น mysql_real_escape_string,
แถบคาดศีรษะ

5
@KhandadNiazi จะกลับมาชื่อของโฟลเดอร์หากการเชื่อมโยงของรูปแบบbasename($_SERVER["REQUEST_URI"], ".php"); http://example.com/somefolderแม้ว่าbasename($_SERVER['PHP_SELF'], ".php");จะส่งคืนชื่อสคริปต์เสมอในกรณีindexนี้
katalin_2003

27

สิ่งนี้อาจช่วย:

basename($_SERVER['PHP_SELF'])

มันจะทำงานแม้ว่าคุณจะใช้รวมถึง


ที่ยังเหลือ.phpเมื่อสิ้นสุดที่ OP พยายามที่จะกำจัด
Brian Leishman

3
@stumpx จากนั้นคุณสามารถทำได้basename($_SERVER['PHP_SELF'], ".php");
katalin_2003

ฉันมี 2 ไฟล์, header.php และ home.php, header.php เรียกว่าใน home.php ฉันจะตรวจสอบในส่วนหัวว่าหน้าปัจจุบันเป็น home.php หรือ contact.php ดังนั้นฉันสามารถเปลี่ยนแบนเนอร์ ฯลฯ
Moxet Khan

19

คำตอบของ alex นั้นถูกต้อง แต่คุณสามารถทำได้โดยไม่ต้องใช้นิพจน์ทั่วไปเช่น:

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

6
การดำเนินการนี้มีความเสี่ยงที่จะทำให้ชื่อไฟล์hey.php-i-am-a-weird-filename.phpเสียหาย
alex

ฉันคิดแล้ว แต่ฉันคิดว่าพวกเขาใช้มันสำหรับหน้าเดียวที่กล่าวถึงในคำถาม คุณสามารถตรวจสอบเพื่อดูว่า ".php" อยู่ท้ายสตริงหรือไม่ ไม่ได้บอกว่าคำถามของคุณผิด แต่การกดหน้าอกปกติอาจเป็นเรื่องเจ็บปวดในตูดและมักจะใช้ในสถานการณ์ที่สามารถใช้วิธีการที่เน้นทรัพยากรได้ง่ายขึ้นและน้อยลง
ผู้ใช้

Shofner ฉันใช้การวัดประสิทธิภาพและวิธีการของคุณวิ่งเร็วเป็นสองเท่า แต่ยังคงซ้ำกว่า 1,000 ครั้งความแตกต่างคือ 0.003231 microseconds
alex

16

นี่คือรายการสิ่งที่ฉันพบเมื่อเร็ว ๆ นี้ค้นหาคำตอบ:

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

อย่าลืมลบ :)

<br>


1
ดังนั้น ... SCRIPT_NAME, SCRIPT_FILENAME และ PHP_SELF นั้นต่างกัน 3 เรื่องใช่ไหม (ทำไม vars จำนวนมากที่มีค่าเท่ากัน?! Rasmus ติดยาแน่นอน)
SparK

สถานการณ์จำลอง: index.phpรวมheader.phpสิ่งfunctions.phpที่log_location()อยู่ในนั้นด้วย ผมเรียกlog_location()ในและจากนั้นผมทำงานheader.php index.phpฟังก์ชั่นด้านบนทั้งหมดพิมพ์ฟังก์ชั่นหรือดัชนีหรือโดเมนหรือการเปลี่ยนแปลงของสิ่งเหล่านี้ ฉันไม่รู้ว่าสคริปต์ PHP ตัวใดที่เรียกว่าฟังก์ชัน มันเป็นไปได้หรือไม่ (เป็นแบบเส้นเดียว)? @begoyan
s3c


4

วิธีทั่วไปมากขึ้นจะใช้pathinfo () ตั้งแต่เวอร์ชัน 5.2 PATHINFO_FILENAMEจะสนับสนุน

ดังนั้น

pathinfo(__FILE__,PATHINFO_FILENAME)

จะทำสิ่งที่คุณต้องการ


2

$ argv [0]

$argv[0]ฉันได้พบมันง่ายมากที่จะใช้ ชื่อของสคริปต์ดำเนินการมักจะเป็นองค์ประกอบแรกใน$argvอาร์เรย์ แตกต่างจากวิธีอื่น ๆ ทั้งหมดที่แนะนำในคำตอบอื่น ๆ วิธีนี้ไม่จำเป็นต้องใช้basename()เพื่อลบทรีไดเรกทอรี ตัวอย่างเช่น:

  • echo __FILE__; ส่งคืนสิ่งที่ชอบ /my/directory/path/my_script.php

  • echo $argv[0]; ผลตอบแทน my_script.php



2

สิ่งนี้ใช้ได้สำหรับฉันแม้ว่าจะทำงานในไฟล์ PHP ที่รวมอยู่และคุณต้องการชื่อไฟล์ของไฟล์ php ปัจจุบันที่กำลังทำงานอยู่:

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

ผลลัพธ์:

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__ ใช้ตัวอย่างขึ้นอยู่กับผลลัพธ์ของเซิร์ฟเวอร์ในพื้นที่:

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

อย่างที่บางคนพูดbasename($_SERVER["SCRIPT_FILENAME"], '.php')และbasename( __FILE__, '.php')เป็นวิธีทดสอบที่ดี

สำหรับฉันโดยใช้วิธีที่สองคือคำตอบสำหรับการตรวจสอบความถูกต้องบางอย่างที่ฉันทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.