获取当前脚本文件名


273

如果我有PHP脚本,如何从该脚本内部获取文件名?

另外,给定表单脚本的名称,jquery.js.php我如何仅提取“ jquery.js”部分?


1
这是两个问题合而为一。您想知道哪一个。如何分辨当前脚本的名称,如何从文件名中删除扩展名,或两者兼而有之?
Pekka 2010年

3
这个词also表示您正在询问其他问题。嘘。一些偷看的孩子。
digiscripter

Answers:


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
为什么不简单地使用substrstrrchr剥离最后的.和后面的所有东西呢?
ThiefMaster 2010年

9
@ThiefMaster因为PHP内置了一些东西来处理文件扩展名。车轮存在,并且滚动良好。
Alex

2
但是正则表达式可能会更昂贵!
ThiefMaster

14
__FILE__为您提供.php该行所在的文件时,您实际上需要$_SERVER['SCRIPT_NAME']当前正在运行的顶级脚本(该脚本由Web服务器调用或直接在命令行上调用)
Drew Stephens

2
@Drew我想这取决于您真正想要的。
alex

125

当您希望包含文件知道文件所在的文件(即实际请求的脚本名称)时,请使用:

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

因为当您写入文件时,您通常会知道其名称。

编辑:如Alec Teal所述,如果您使用符号链接,它将显示符号链接名称。


4
这对我很有帮助))),需要在所需文件中获得脚本文件名))
Denys Klymenko 2015年

4
这是错误的,它不会获取实际的PHP文件,但是Web服务器已将文件解析为请求。如果您使用simlink,则有所不同。
亚历克·蒂尔

如果使用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,它将返回index而不是header


这是更安全SCRIPT_FILENAME还是REQUEST_URI?我知道它们都是服务器变量,但不是REQUEST_URI用户篡改的值吗?它造成“ URI注入”威胁
SparK 2014年

1
都有自己的无能,但是你可以使用安全不同的文件管理器您的网址,如mysql_real_escape_string,的stripslashes等
Khandad尼亚兹

5
basename($_SERVER["REQUEST_URI"], ".php");如果链接的格式为@KhandadNiazi,则将返回文件夹的名称http://example.com/somefolderbasename($_SERVER['PHP_SELF'], ".php");在这种情况下,虽然将始终返回脚本的名称index
katalin_2003 2014年

27

这可能会有所帮助:

basename($_SERVER['PHP_SELF'])

即使您使用include,它也将起作用。


这仍然留下了.phpOP试图摆脱的结局
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 2015年

19

alex的答案是正确的,但您也可以在没有正则表达式的情况下执行以下操作:

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

6
这冒着损坏文件名的风险hey.php-i-am-a-weird-filename.php
Alex

我已经想到了这一点,但是我发现他们正在问题中提到的单页上使用它。您还可以检查“ .php”是否在字符串的末尾。并不是说您的问题是错误的,但是定期进行压缩可能会给您带来痛苦,并且通常用于可能使用更简单且资源占用更少的方法的情况下。
用户

Shofner我运行了一些基准测试,您的运行速度快了大约两倍,但仍然进行了1000次迭代,差异为0.003231微秒。
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种不同的东西,对吗?(为什么用同样的价值?拉斯穆斯这么多瓦尔是在药物肯定)
SPARK

方案:index.php包括header.php,其中又包括functions.phplog_location()驻留位置。我打电话log_location()header.php,然后我跑index.php。以上所有功能均会打印出功能,索引或域或其中的一些变化。我不知道哪个PHP脚本调用了该函数。甚至有可能(单线)?@begoyan
s3c

6

您还可以使用以下命令:

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

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')是测试这一点的好方法。

对我来说,第二个是我正在做的一些验证说明的解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.