【发布时间】:2011-05-12 09:40:06
【问题描述】:
如果我有 PHP 脚本,如何从该脚本中获取文件名?
另外,给定jquery.js.php 形式的脚本名称,如何仅提取“jquery.js”部分?
【问题讨论】:
-
这是两个问题合二为一。你想知道哪一个。如何判断当前脚本的名称,如何从文件名中删除扩展名,或两者兼而有之?
-
also这个词表示您在问一个额外的问题。嘘。一些偷窥的孩子。
如果我有 PHP 脚本,如何从该脚本中获取文件名?
另外,给定jquery.js.php 形式的脚本名称,如何仅提取“jquery.js”部分?
【问题讨论】:
also 这个词表示您在问一个额外的问题。嘘。一些偷窥的孩子。
只需使用PHP magic constant __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"
正如您所料,使用标准字符串库函数是much quicker。
function chopExtension($filename) {
return substr($filename, 0, strrpos($filename, '.'));
}
【讨论】:
substr 和strrchr 剥离最后一个. 以及它后面的所有内容?
__FILE__ 为您提供了该行所在的.php 文件,但您实际上希望$_SERVER['SCRIPT_NAME'] 用于当前运行的顶级脚本(由Web 服务器调用或直接在命令行)
如果您希望您的包含知道它在哪个文件中(即实际请求的脚本名称),请使用:
basename($_SERVER["SCRIPT_FILENAME"], '.php')
因为当您写入文件时,您通常知道它的名称。
编辑:正如 Alec Teal 所说,如果您使用符号链接,它将显示符号链接名称。
【讨论】:
pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
见http://php.net/manual/en/function.pathinfo.php
pathinfo(__FILE__, PATHINFO_FILENAME);
【讨论】:
这是basename(__FILE__, ".php") 和basename($_SERVER['REQUEST_URI'], ".php") 之间的区别。
basename(__FILE__, ".php") 显示包含此代码的文件的名称 - 这意味着如果您在 header.php 中包含此代码并且当前页面是 index.php,它将返回 header 而不是 index。
basename($_SERVER["REQUEST_URI"], ".php") - 如果您在 header.php 中包含此代码并且当前页面是 index.php,它将返回 index不是标题。
【讨论】:
SCRIPT_FILENAME 或 REQUEST_URI 哪个更安全?我知道它们都是服务器变量,但 REQUEST_URI 不是用户篡改的值吗?它启用了“URI 注入”威胁
basename($_SERVER["REQUEST_URI"], ".php"); 如果链接格式为 http://example.com/somefolder ,将返回文件夹的名称。而basename($_SERVER['PHP_SELF'], ".php"); 将始终返回脚本的名称,在本例中为index。
这可能会有所帮助:
basename($_SERVER['PHP_SELF'])
即使你使用包含它也可以工作。
【讨论】:
.php
basename($_SERVER['PHP_SELF'], ".php");
这是我最近在寻找答案时发现的列表:
//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>
【讨论】:
index.php 包括header.php,而functions.php 又包括log_location() 所在的位置。我在header.php 中调用log_location(),然后运行index.php。所有上述函数都打印出函数或索引或域或这些的一些变体。我不知道哪个 PHP 脚本调用了该函数。甚至有可能(单线)? @begoyan
alex 的回答是正确的,但您也可以在没有正则表达式的情况下这样做:
str_replace(".php", "", basename($_SERVER["SCRIPT_NAME"]));
【讨论】:
hey.php-i-am-a-weird-filename.php 之类的文件名。
你也可以使用这个:
echo $pageName = basename($_SERVER['SCRIPT_NAME']);
【讨论】:
更通用的方法是使用pathinfo()。从 5.2 版开始,它支持PATHINFO_FILENAME。
所以
pathinfo(__FILE__,PATHINFO_FILENAME)
也会做你需要的。
【讨论】:
$argv[0]
我发现使用$argv[0] 要简单得多。执行脚本的名称始终是$argv 数组中的第一个元素。与其他答案中建议的所有其他方法不同,此方法不需要使用 basename() 来删除目录树。例如:
echo __FILE__; 返回类似/my/directory/path/my_script.php
echo $argv[0]; 返回my_script.php
【讨论】:
这对我有用,即使在包含的 PHP 文件中运行,并且您希望当前 php 文件的文件名正在运行:
$currentPage= $_SERVER["SCRIPT_NAME"];
$currentPage = substr($currentPage, 1);
echo $currentPage;
结果:
index.php
【讨论】:
试试这个
$current_file_name = $_SERVER['PHP_SELF'];
echo $current_file_name;
【讨论】:
试试这个
$file = basename($_SERVER['PATH_INFO']);//Filename requested
【讨论】:
$_SERVER['SCRIPT_NAME'] 不是一个更好的主意,以防脚本按照上面 cmets 中@drew-stephens 的建议在终端上运行
$file = basename($_SERVER['SCRIPT_NAME']);
$filename = "jquery.js.php";
$ext = pathinfo($filename, PATHINFO_EXTENSION);//will output: php
$file_basename = pathinfo($filename, PATHINFO_FILENAME);//will output: jquery.js
【讨论】:
__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
【讨论】:
正如一些人所说,basename($_SERVER["SCRIPT_FILENAME"], '.php') 和 basename( __FILE__, '.php') 是测试这一点的好方法。
对我来说,使用第二个是我正在制作的一些验证说明的解决方案
【讨论】:
虽然__FILE__ 和$_SERVER 是最好的方法,但在某些情况下这可以作为替代方案:
get_included_files();
它包含您从中调用它的文件路径以及所有其他包含。
【讨论】:
例子:
包含文件:config.php
<?php
$file_name_one = basename($_SERVER['SCRIPT_FILENAME'], '.php');
$file_name_two = basename(__FILE__, '.php');
?>
执行文件:index.php
<?php
require('config.php');
print $file_name_one."<br>\n"; // Result: index
print $file_name_two."<br>\n"; // Result: config
?>
【讨论】: