Получить текущее имя файла скрипта


273

Если у меня есть скрипт PHP, как я могу получить имя файла внутри этого скрипта?

Кроме того, учитывая имя скрипта формы jquery.js.php, как я могу извлечь только часть "jquery.js"?


1
Это два вопроса в одном. Какой из них вы хотите знать. Как узнать имя текущего скрипта, как отрезать расширение от имени файла или оба?
Пекка

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 есть что-то встроенное для обработки расширений файлов. Колесо существует и хорошо катится.
Алекс

2
Но регулярное выражение может быть дороже!
ThiefMaster

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

2
@ Я думаю, это зависит от того, чего ты действительно хочешь.
Алекс

125

Когда вы хотите, чтобы ваше включение знало, в каком файле оно находится (то есть, какое имя сценария было запрошено), используйте:

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

Потому что, когда вы пишете в файл, вы обычно знаете его имя.

Редактировать: Как отметил Алек Тил, если вы используете символические ссылки, вместо этого будет отображаться имя символической ссылки.


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 , он вернет заголовок, а не index .

basename($_SERVER["REQUEST_URI"], ".php")- Если вы используете этот код в header.php и текущая страница - index.php , он вернет индекс, а не заголовок .


что безопаснее SCRIPT_FILENAMEили REQUEST_URI? Я знаю, что они оба - серверные переменные, но разве REQUEST_URIпользователь не изменяет их значение? это включает угрозу «инъекции URI»
SparK

1
оба имеют свое собственное бессилие, но вы можете сохранить свой URL-адрес, используя различные файлеры, такие как mysql_real_escape_string, stripslashes и т.д ..
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, чтобы я мог изменить баннер и т. Д.
Моксет Хан

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 разные вещи, верно? (Почему так много варов с одинаковой ценностью? Расмус наверняка
принимал

Сценарий: 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.