【问题标题】:Get the current script file name获取当前脚本文件名
【发布时间】:2011-05-12 09:40:06
【问题描述】:

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

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

【问题讨论】:

  • 这是两个问题合二为一。你想知道哪一个。如何判断当前脚本的名称,如何从文件名中删除扩展名,或两者兼而有之?
  • also 这个词表示您在问一个额外的问题。嘘。一些偷窥的孩子。

标签: php file


【解决方案1】:

只需使用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, '.'));
}

【讨论】:

  • 为什么不简单地使用substrstrrchr 剥离最后一个. 以及它后面的所有内容?
  • @ThiefMaster 因为 PHP 内置了一些东西来处理文件扩展名。轮子存在,并且滚动良好。
  • 但是正则表达式可能更贵!
  • 虽然__FILE__ 为您提供了该行所在的.php 文件,但您实际上希望$_SERVER['SCRIPT_NAME'] 用于当前运行的顶级脚本(由Web 服务器调用或直接在命令行)
  • @Drew 我想这取决于你真正想要什么。
【解决方案2】:

如果您希望您的包含知道它在哪个文件中(即实际请求的脚本名称),请使用:

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

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

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

【讨论】:

  • 这对我很有帮助)) 需要获取脚本文件名,在 必需文件)
  • 这是错误的,它不会得到实际的 PHP 文件,而是网络服务器解析到请求的文件。如果您使用 simlinks,则会有所不同。
  • 如果你使用 PHP-FPM 也会有所不同。
  • 如果你也需要扩展,使用pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
  • @c00000fd 如果您需要扩展,只需省略第二个参数...
【解决方案3】:

http://php.net/manual/en/function.pathinfo.php

pathinfo(__FILE__, PATHINFO_FILENAME);

【讨论】:

    【解决方案4】:

    这是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_FILENAMEREQUEST_URI 哪个更安全?我知道它们都是服务器变量,但 REQUEST_URI 不是用户篡改的值吗?它启用了“URI 注入”威胁
    • 两者都有自己的无能,但您可以使用不同的文件管理器保护您的 url,如 mysql_real_escape_string、stripslashes 等。
    • @KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php"); 如果链接格式为 http://example.com/somefolder ,将返回文件夹的名称。而basename($_SERVER['PHP_SELF'], ".php"); 将始终返回脚本的名称,在本例中为index
    【解决方案5】:

    这可能会有所帮助:

    basename($_SERVER['PHP_SELF'])
    

    即使你使用包含它也可以工作。

    【讨论】:

    • 这仍然留下了 OP 试图摆脱的 .php
    • @stumpx 那你就可以basename($_SERVER['PHP_SELF'], ".php");
    • 我有 2 个文件,header.php 和 home.php,在 home.php 中调用 header.php 我如何在 header 中检测到当前页面是 home.php 或 contact.php 所以我可以更改一些横幅等。
    【解决方案6】:

    这是我最近在寻找答案时发现的列表:

    //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']);
    

    别忘了删除:)

    &lt;br&gt;

    【讨论】:

    • 所以... SCRIPT_NAME、SCRIPT_FILENAME 和 PHP_SELF 是 3 个不同的东西,对吧? (为什么这么多具有​​相同价值的变量?!拉斯穆斯肯定在吸毒)
    • 场景:index.php 包括header.php,而functions.php 又包括log_location() 所在的位置。我在header.php 中调用log_location(),然后运行index.php。所有上述函数都打印出函数或索引或域或这些的一些变体。我不知道哪个 PHP 脚本调用了该函数。甚至有可能(单线)? @begoyan
    【解决方案7】:

    alex 的回答是正确的,但您也可以在没有正则表达式的情况下这样做:

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

    【讨论】:

    • 这可能会破坏hey.php-i-am-a-weird-filename.php 之类的文件名。
    • 我已经想到了,但我认为他们正在将它用于问题中提到的单页。您还可以检查“.php”是否位于字符串的末尾。并不是说您的问题是错误的,但常规的 espressions 可能会让人头疼,并且通常用于可以使用更简单且资源消耗更少的方法的情况。
    • Shofner 我运行了一些基准测试,你的方法运行速度大约是原来的两倍,但仍然超过 1000 次迭代,差异为 0.003231 微秒。
    【解决方案8】:

    你也可以使用这个:

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

    【讨论】:

      【解决方案9】:

      更通用的方法是使用pathinfo()。从 5.2 版开始,它支持PATHINFO_FILENAME

      所以

      pathinfo(__FILE__,PATHINFO_FILENAME)
      

      也会做你需要的。

      【讨论】:

        【解决方案10】:

        $argv[0]

        我发现使用$argv[0] 要简单得多。执行脚本的名称始终是$argv 数组中的第一个元素。与其他答案中建议的所有其他方法不同,此方法不需要使用 basename() 来删除目录树。例如:

        • echo __FILE__; 返回类似/my/directory/path/my_script.php

        • echo $argv[0]; 返回my_script.php

        【讨论】:

          【解决方案11】:

          这对我有用,即使在包含的 PHP 文件中运行,并且您希望当前 php 文件的文件名正在运行:

          $currentPage= $_SERVER["SCRIPT_NAME"];
          $currentPage = substr($currentPage, 1);
          echo $currentPage;
          

          结果:

          index.php

          【讨论】:

            【解决方案12】:

            试试这个

            $current_file_name = $_SERVER['PHP_SELF'];
            echo $current_file_name;
            

            【讨论】:

              【解决方案13】:

              试试这个

              $file = basename($_SERVER['PATH_INFO']);//Filename requested

              【讨论】:

              • $_SERVER['SCRIPT_NAME'] 不是一个更好的主意,以防脚本按照上面 cmets 中@drew-stephens 的建议在终端上运行
              • 使用 basename 将规范化文件名并防止路径遍历 ../../ 攻击
              • 抱歉...我的意思是$file = basename($_SERVER['SCRIPT_NAME']);
              【解决方案14】:
              $filename = "jquery.js.php";
              $ext = pathinfo($filename, PATHINFO_EXTENSION);//will output: php
              $file_basename = pathinfo($filename, PATHINFO_FILENAME);//will output: jquery.js
              

              【讨论】:

                【解决方案15】:

                __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
                

                【讨论】:

                  【解决方案16】:

                  正如一些人所说,basename($_SERVER["SCRIPT_FILENAME"], '.php')basename( __FILE__, '.php') 是测试这一点的好方法。

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

                  【讨论】:

                    【解决方案17】:

                    虽然__FILE__$_SERVER 是最好的方法,但在某些情况下这可以作为替代方案:

                    get_included_files();
                    

                    它包含您从中调用它的文件路径以及所有其他包含。

                    【讨论】:

                      【解决方案18】:

                      例子:

                      包含文件: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
                      ?>
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-01-12
                        • 2012-01-21
                        • 2017-09-09
                        • 1970-01-01
                        • 2012-12-21
                        • 2011-05-08
                        • 2013-10-31
                        • 2011-10-15
                        相关资源
                        最近更新 更多