Отримайте поточне ім'я файлу сценарію


273

Якщо у мене є сценарій PHP, як я можу отримати ім'я файлу всередині цього сценарію?

Також, даючи назву скрипту форми jquery.js.php, як я можу витягти лише частину "jquery.js"?


1
Це два питання в одному. Якого ви хочете знати. Як сказати ім'я поточного сценарію, як відрізати розширення від імені файлу чи обох?
Pekka

3
Слово alsoозначає, що ви задаєте додаткове запитання. Шиш. Деякі визирають діти.
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
@TentistMaster Оскільки в PHP є щось вбудоване для обробки розширень файлів. Колесо існує, і добре котиться.
алекс

2
Але регекс може бути дорожчим!
ThiefMaster

14
Хоча __FILE__ви надаєте .phpфайл, у якому знаходиться рядок, ви дійсно хочете $_SERVER['SCRIPT_NAME']для поточного сценарію найвищого рівня (того, на який викликався веб-сервер або безпосередньо в командному рядку)
Дрю Стівенс,

2
@Drew Я думаю, це залежить від того, що ти насправді хочеш.
alex

125

Якщо ви хочете, щоб ваш включаючий файл знав, у якому файлі він знаходиться (тобто, яке саме ім'я скрипта було запитано), використовуйте:

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

Тому що, коли ви пишете у файл, ви зазвичай знаєте його ім'я.

Редагувати: Як зазначає Alec Teal, якщо ви використовуєте символьні посилання, натомість буде вказано ім'я символьної посилання.


4
Це мені було корисно)) потрібно було отримати ім'я файлу сценарію в потрібному файлі )
Денис Клименко,

4
Це неправильно, він не отримає фактичний файл PHP, але файл веб-сервер вирішив на запит. Інше, якщо ви користуєтеся посиланнями.
Алек Тіл

Також відрізняється, якщо ви використовуєте PHP-FPM.
Ендрю Енслі

Також якщо вам також потрібне розширення, використовуйте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, стриптиз тощо.
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");поверне ім'я папки, якщо посилання має форму http://example.com/somefolder. Хоча basename($_SERVER['PHP_SELF'], ".php");завжди буде повертати ім'я сценарію, в цьому випадку index.
katalin_2003

27

Це може допомогти:

basename($_SERVER['PHP_SELF'])

він буде працювати, навіть якщо ви використовуєте include.


Це все ще залишає .phpкінець, якого намагалися позбутися ОП
Брайан Лейшман

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.
алекс

Я вже про це думав, але вважав, що вони використовують це для однієї сторінки, зазначеної у запитанні. Ви також можете перевірити, чи є ".php" в кінці рядка. Якщо не сказати, що ваше запитання є неправильним, але регулярні вислови можуть бути болем у попі, і вони зазвичай використовуються в сценаріях, де можна використовувати набагато простіший і менш ресурсомісткий метод.
користувач

Шофнер, я провів деякі орієнтири, і ваш шлях проходить приблизно вдвічі швидше, але все ж за 1000 повторень різниця становить 0,003231 мікросекунди.
алекс

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 різні речі, правда? (Чому так багато вар з такою ж цінністю ?! Расмус був на наркотиках точно)
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__ використовувати приклади, засновані на результатах серверу 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

Як казали деякі, basename($_SERVER["SCRIPT_FILENAME"], '.php')і basename( __FILE__, '.php')це хороші способи перевірити це.

Для мене використання другого було рішенням деяких інструкцій з перевірки, які я робив

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.