816

これは、Web 上のどこにでもある質問で、さまざまな回答があります。

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

$exts = split("[/\\.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

ただし、常に「最善の方法」があり、それは Stack Overflow にあるはずです。

4

29 に答える 29

1889

他のスクリプト言語の人々は、PHP ではなくそれを行うための組み込み関数を持っているため、常に自分の言語の方が優れていると考えています (私は現在 Pythonistas を見ています :-))。

実際に存在しますが、それを知っている人はほとんどいません。会うpathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

これは高速で組み込みです。pathinfo()渡す定数に応じて、正規パスなどの他の情報を提供できます。

非 ASCII 文字を扱えるようにしたい場合は、最初にロケールを設定する必要があることに注意してください。例えば:

setlocale(LC_ALL,'en_US.UTF-8');

また、これはファイルの内容や MIME タイプを考慮していないことに注意してください。拡張子のみを取得します。しかし、それはあなたが求めたものです。

最後に、これは、PARSE_URL を使用してカバーされる URL リソース パスではなく、ファイル パスに対してのみ機能することに注意してください。

楽しみ

于 2008-10-06T11:03:24.493 に答える
184

pathinfo()

$path_info = pathinfo('/foo/bar/baz.bill');

echo $path_info['extension']; // "bill"
于 2008-10-06T11:02:33.590 に答える
66

もありますSplFileInfo

$file = new SplFileInfo($path);
$ext  = $file->getExtension();

文字列の代わりにそのようなオブジェクトを渡すと、より良いコードを記述できることがよくあります。あなたのコードはもっと話しています。PHP 5.4 以降、これはワンライナーです。

$ext  = (new SplFileInfo($path))->getExtension();
于 2012-10-17T10:32:32.363 に答える
24

E-satis の応答は、ファイル拡張子を決定する正しい方法です。

または、ファイル拡張子に依存する代わりに、fileinfoを使用してファイルの MIME タイプを判別することもできます。

ユーザーがアップロードした画像を処理する簡単な例を次に示します。

// Code assumes necessary extensions are installed and a successful file upload has already occurred

// Create a FileInfo object
$finfo = new FileInfo(null, '/path/to/magic/file');

// Determine the MIME type of the uploaded file
switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) {        
    case 'image/jpg':
        $im = imagecreatefromjpeg($_FILES['image']['tmp_name']);
    break;

    case 'image/png':
        $im = imagecreatefrompng($_FILES['image']['tmp_name']);
    break;

    case 'image/gif':
        $im = imagecreatefromgif($_FILES['image']['tmp_name']);
    break;
}
于 2008-10-06T14:23:33.620 に答える
22

パスが含まれていない限り、次のものも使用できます。

array_pop(explode('.', $fname))

$fnameファイルの名前はどこにありますか。例: my_picture.jpg。そして、結果は次のようになります。jpg

于 2012-08-11T12:42:33.573 に答える
13

1) (PHP 5 >= 5.3.6)を使用している場合は、 SplFileInfo::getExtension を使用できます— ファイル拡張子を取得します

サンプルコード

<?php

$info = new SplFileInfo('test.png');
var_dump($info->getExtension());

$info = new SplFileInfo('test.tar.gz');
var_dump($info->getExtension());

?>

これは出力されます

string(3) "png"
string(2) "gz"

2) (PHP 4 >= 4.0.3、PHP 5)を使用している場合に拡張機能を取得する別の方法は、pathinfoです。

サンプルコード

<?php

$ext = pathinfo('test.png', PATHINFO_EXTENSION);
var_dump($ext);

$ext = pathinfo('test.tar.gz', PATHINFO_EXTENSION);
var_dump($ext);

?>

これは出力されます

string(3) "png"
string(2) "gz"

// 編集: 括弧を削除

于 2014-08-02T07:52:06.087 に答える
12

を使用しないと便利な場合がありますpathinfo($path, PATHINFO_EXTENSION)。例えば:

$path = '/path/to/file.tar.gz';

echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz

pathinfoまた、一部の非ASCII文字の処理に失敗することにも注意してください(通常、出力からそれらを抑制するだけです)。通常は問題にならない拡張機能ですが、その警告に注意することは問題ありません。

于 2012-11-01T18:11:18.010 に答える
6

ここに例があります。$filename が「example.txt」であるとします。

$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));

したがって、$ext は ".txt" になります。

于 2015-02-25T23:22:17.000 に答える
6

pathinfoは配列です。ディレクトリ名、ファイル名、拡張子などを確認できます。

$path_parts = pathinfo('test.png');

echo $path_parts['extension'], "\n";
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['filename'], "\n";
于 2016-06-03T04:43:04.233 に答える
5

クイックフィックスは次のようなものになります。

// Exploding the file based on the . operator
$file_ext = explode('.', $filename);

// Count taken (if more than one . exist; files like abc.fff.2013.pdf
$file_ext_count = count($file_ext);

// Minus 1 to make the offset correct
$cnt = $file_ext_count - 1;

// The variable will have a value pdf as per the sample file name mentioned above.
$file_extension = $file_ext[$cnt];
于 2015-05-26T09:29:54.553 に答える
4

これも試すことができます:

 pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
于 2016-05-24T09:53:55.377 に答える
3

pathinfo()およびSplFileInfoソリューションは、ローカル ファイル システム上の標準ファイルに対してはうまく機能することがわかりましたが、有効な画像の URL に#(フラグメント識別子) および/または?(クエリ パラメータ)が含まれている可能性があるため、リモート ファイルを操作している場合は問題が発生する可能性があります。 URL の最後に、これらの両方のソリューションが (間違って) ファイル拡張子の一部として扱います。

pathinfo()これは、最初に URL を解析してファイル拡張子の後の不要な混乱を取り除いた後、URL で使用する信頼できる方法であることがわかりました。

$url_components = parse_url($url); // First parse the URL
$url_path = $url_components['path']; // Then get the path component
$ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
于 2015-01-20T20:40:36.697 に答える
2

これはうまくいきます

$ext = pathinfo($filename, PATHINFO_EXTENSION);
于 2015-01-15T10:12:23.017 に答える
2

特定のフォルダー内のすべてのファイル拡張子を取得し、特定のファイル拡張子で操作を実行できます。

<?php
    $files = glob("abc/*.*"); // abc is the folder all files inside folder
    //print_r($files);
    //echo count($files);
    for($i=0; $i<count($files); $i++):
         $extension = pathinfo($files[$i], PATHINFO_EXTENSION);
         $ext[] = $extension;
         // Do operation for particular extension type
         if($extension=='html'){
             // Do operation
         }
    endfor;
    print_r($ext);
?>
于 2016-05-04T05:35:14.460 に答える
2

IMO、これは name.name.name.ext のようなファイル名がある場合の最良の方法です(醜いですが、時々起こります):

$ext     = explode('.', $filename); // Explode the string
$my_ext  = end($ext); // Get the last entry of the array

echo $my_ext;
于 2019-04-05T16:19:03.577 に答える
1

(ルーターなどで) 速度を求めている場合は、おそらくすべてをトークン化する必要はありません。他の多くの答えは失敗します/root/my.folder/my.css

ltrim(strrchr($PATH, '.'),'.');
于 2016-09-09T13:54:18.230 に答える
-1

使用する

str_replace('.', '', strrchr($file_name, '.'))

拡張子をすばやく取得するため(ファイル名に拡張子が含まれていることが確実にわかっている場合)。

于 2012-11-28T12:05:26.560 に答える