Почему бы просто не использовать substrи strrchrубрать последнее .и все, что за этим стоит?
ThiefMaster
9
@ThiefMaster Потому что в PHP есть что-то встроенное для обработки расширений файлов. Колесо существует и хорошо катится.
Алекс
2
Но регулярное выражение может быть дороже!
ThiefMaster
14
В то время как __FILE__вы .phpполучаете файл, в котором находится эта строка, вы на самом деле хотите $_SERVER['SCRIPT_NAME']запустить текущий скрипт верхнего уровня (тот, который был вызван веб-сервером или непосредственно из командной строки)
Дрю Стивенс,
2
@ Я думаю, это зависит от того, чего ты действительно хочешь.
Алекс
125
Когда вы хотите, чтобы ваше включение знало, в каком файле оно находится (то есть, какое имя сценария было запрошено), используйте:
basename($_SERVER["SCRIPT_FILENAME"],'.php')
Потому что, когда вы пишете в файл, вы обычно знаете его имя.
Редактировать: Как отметил Алек Тил, если вы используете символические ссылки, вместо этого будет отображаться имя символической ссылки.
Вот разница между 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 верен, но вы также можете сделать это без регулярных выражений, например:
Это рискует исказить имя файла, как 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']);
Итак ... SCRIPT_NAME, SCRIPT_FILENAME и PHP_SELF - это 3 разные вещи, верно? (Почему так много варов с одинаковой ценностью? Расмус наверняка
принимал
Сценарий: index.phpвключает header.phpв себя functions.php, который, в свою очередь, включает , где log_location()находится. Я называю log_location()в header.php, а затем я бегу index.php. Все вышеперечисленные функции выводят либо функцию, либо индекс, либо домен, либо некоторые их варианты. Я не хочу знать, какой скрипт PHP вызвал функцию. Это вообще возможно (в одну строчку)? @begoyan
Я нашел это намного проще в использовании $argv[0]. Имя исполняемого скрипта всегда является первым элементом в $argvмассиве. В отличие от всех других методов, предложенных в других ответах, этот метод не требует использования basename()для удаления дерева каталогов. Например:
echo __FILE__; возвращает что-то вроде /my/directory/path/my_script.php
also
означает, что вы задаете дополнительный вопрос. Sheesh. Некоторые выглядывают дети.Ответы:
Просто используйте магическую константу PHP,
__FILE__
чтобы получить текущее имя файла.Но кажется, что вы хотите часть без
.php
. Так...Более общий для удаления расширения файлов будет выглядеть следующим образом ...
Как и следовало ожидать, использование стандартных функций библиотеки строк выполняется намного быстрее .
источник
substr
иstrrchr
убрать последнее.
и все, что за этим стоит?__FILE__
вы.php
получаете файл, в котором находится эта строка, вы на самом деле хотите$_SERVER['SCRIPT_NAME']
запустить текущий скрипт верхнего уровня (тот, который был вызван веб-сервером или непосредственно из командной строки)Когда вы хотите, чтобы ваше включение знало, в каком файле оно находится (то есть, какое имя сценария было запрошено), используйте:
Потому что, когда вы пишете в файл, вы обычно знаете его имя.
Редактировать: Как отметил Алек Тил, если вы используете символические ссылки, вместо этого будет отображаться имя символической ссылки.
источник
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
Смотрите http://php.net/manual/en/function.pathinfo.php
источник
Вот разница между
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»basename($_SERVER["REQUEST_URI"], ".php");
вернет имя папки, если ссылка имеет формуhttp://example.com/somefolder
. Хотяbasename($_SERVER['PHP_SELF'], ".php");
всегда будет возвращать имя скрипта, в этом случаеindex
.Это может помочь:
это будет работать, даже если вы используете include.
источник
.php
в конце, от которого ОП пытался избавитьсяbasename($_SERVER['PHP_SELF'], ".php");
ответ alex верен, но вы также можете сделать это без регулярных выражений, например:
источник
hey.php-i-am-a-weird-filename.php
.Вот список того, что я недавно нашел в поиске ответа:
Не забудьте удалить :)
источник
index.php
включаетheader.php
в себяfunctions.php
, который, в свою очередь, включает , гдеlog_location()
находится. Я называюlog_location()
вheader.php
, а затем я бегуindex.php
. Все вышеперечисленные функции выводят либо функцию, либо индекс, либо домен, либо некоторые их варианты. Я не хочу знать, какой скрипт PHP вызвал функцию. Это вообще возможно (в одну строчку)? @begoyanВы также можете использовать это:
источник
Более общим способом было бы использование pathinfo () . Начиная с версии 5.2 он поддерживает
PATHINFO_FILENAME
.Так
также сделаю то, что вам нужно.
источник
$ ARGV [0]
Я нашел это намного проще в использовании
$argv[0]
. Имя исполняемого скрипта всегда является первым элементом в$argv
массиве. В отличие от всех других методов, предложенных в других ответах, этот метод не требует использованияbasename()
для удаления дерева каталогов. Например:echo __FILE__;
возвращает что-то вроде/my/directory/path/my_script.php
echo $argv[0];
возвращаетсяmy_script.php
источник
Попробуй это
источник
Это работает для меня, даже когда запускается внутри включенного PHP-файла, и вы хотите, чтобы имя текущего файла php работало:
Результат:
источник
источник
__FILE__
использовать примеры на основе результатов сервера localhost:источник
Как некоторые говорили
basename($_SERVER["SCRIPT_FILENAME"], '.php')
иbasename( __FILE__, '.php')
есть хорошие способы проверить это.Для меня использование второго было решением для некоторых инструкций проверки, которые я делал
источник