現在のスクリプトファイル名を取得する


273

PHPスクリプトがある場合、そのスクリプト内からファイル名を取得するにはどうすればよいですか?

また、という形式のスクリプトの名前が与えられた場合jquery.js.php、「jquery.js」の部分だけを抽出するにはどうすればよいですか?


1
これは1つの2つの質問です。あなたはどちらを知りたいですか?現在のスクリプト名を確認する方法、ファイル名から拡張子を切り離す方法、またはその両方
Pekka、

3
単語alsoは、追加の質問をしていることを示します。シーッシュ。いくつかの子供をのぞきます。
デジスクリプター2017

回答:


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には、ファイル拡張子を処理するためのものが組み込まれているためです。ホイールは存在し、よく転がります。
アレックス、2011年

2
しかし、正規表現はもっと高価かもしれません!
ThiefMaster 2010年

14
一方で__FILE__、あなたに与え.php行が含まれているファイルを、あなたが実際にしたい$_SERVER['SCRIPT_NAME'](Webサーバによって、または直接コマンドラインで呼び出されたことを)現在実行中のトップレベルのスクリプトのために
ドリュースティーブンス

2
@Drewそれはあなたが本当に欲しいものに依存すると思います。
アレックス2011

125

インクルードにそれがどのファイルにあるか(つまり、実際に要求されたスクリプト名)を知らせたい場合は、次を使用します。

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

ファイルに書き込んでいるときは、通常その名前を知っているからです。

編集:Alec Tealが指摘したように、シンボリックリンクを使用すると、代わりにシンボリックリンク名が表示されます。


4
これは私にとって役に立ちました))必要なファイルでスクリプトファイル名を取得する必要がありました
Denys Klymenko '27年

4
これは間違っています。実際のPHPファイルは取得されませんが、Webサーバーが要求に対して解決したファイルです。simlinksを使用する場合は異なります。
アレックティール2016年

PHP-FPMを使用する場合も異なります。
Andrew Ensley 16

また、拡張機能も必要な場合は、pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME);
c00000fd

@ c00000fd拡張機能が必要な場合は、2番目のパラメーターを省略してください...
SparK


56

ここでの違いであるbasename(__FILE__, ".php")とはbasename($_SERVER['REQUEST_URI'], ".php")

basename(__FILE__, ".php")は、このコードが含まれているファイルの名前を示しています。つまり、このコードをheader.phpに含め、現在のページがindex.phpの場合、インデックスではなくヘッダーを返します

basename($_SERVER["REQUEST_URI"], ".php")-このコードをheader.phpに含めて使用し、 現在のページがindex.phpの場合、ヘッダーではなくインデックスを返します


これは安全ですSCRIPT_FILENAMEREQUEST_URI?私はどちらもサーバー変数であることを知っていますがREQUEST_URI、ユーザーが改ざんした値ではありませんか?「URIインジェクション」の脅威を可能にする
SparK 2014年

1
両方の自分のインポテンスを持っている、しかし、あなたはmysql_real_escape_stringのような、にstripslashesなど。、あなたのURL異なるファイラーを使用して安全なことができます
Khandad Niazi

5
@KhandadNiazi basename($_SERVER["REQUEST_URI"], ".php");は、リンクがの形式の場合、フォルダの名前を返しますhttp://example.com/somefolder。一方では、basename($_SERVER['PHP_SELF'], ".php");常にこのような場合には、スクリプトの名前を返しますindex
katalin_2003 2014年

27

これは役立つかもしれません:

basename($_SERVER['PHP_SELF'])

includeを使用している場合でも機能します。


それでも.php、OPが排除しようとしていた最後に
ブライアンリーシュマン

3
@stumpxその後、次のことができますbasename($_SERVER['PHP_SELF'], ".php");
katalin_2003

私は2つのファイル、header.phpのとhome.phpを持って、header.phpのは、私がなど、いくつかのバナーを変えることができるので、現在のページがhome.phpかcontact.phpであることをヘッダに検出することができますどのようにhome.phpに呼ばれています
Moxet Khan

19

アレックスの答えは正しいですが、次のような正規表現なしでこれを行うこともできます。

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

6
これはのようなファイル名を改ざんするリスクを冒しますhey.php-i-am-a-weird-filename.php
アレックス、2011年

私はすでにそのことを考えていましたが、質問で言及されている単一のページにそれを使用していると思いました。「.php」が文字列の最後にあるかどうかを確認することもできます。あなたの質問が間違っていると言っているわけではありませんが、定期的な抑圧はお尻の痛みのようなものになる可能性があり、通常ははるかに単純でリソース集約型の方法を使用できるシナリオで使用されます。
ユーザーの

Shofner私はいくつかのベンチマークを実行しましたが、あなたの方法は約2倍速く実行されますが、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つの異なるものですよね?(なぜ、同じ値の非常に多くの変数があるのですか?!ラスムスは確かに薬物を服用していた)
SparK

シナリオ:が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')これをテストする良い方法です。

2番目を使用する私にとって、私が行っていたいくつかの検証手順のソリューションでした

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.