web-dev-qa-db-ja.com

PHPでファイル拡張子を取得(抽出)するにはどうすればいいですか?

これはあなたが様々な答えでウェブ上の至る​​所で読むことができる質問です:

$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にあるべきです。

663
e-satis

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

ASCII以外の文字を処理できるようにするには、最初にロケールを設定する必要があります。例えば:

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

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

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

楽しい

1669
e-satis

pathinfo()

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

echo $path_info['extension']; // "bill"
149
Adam Wright

uRLの例:http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

脆弱な PATHINFO を忘れて!

$x = pathinfo($url);
$x['dirname']   ???? 'http://example.com/myfolder'
$x['basename']  ???? 'sympony.mp3?a=1&b=2#XYZ'         // <------- BAD !!
$x['extension'] ???? 'mp3?a=1&b=2#XYZ'                 // <------- BAD !!
$x['filename']  ???? 'sympony'

より安全な PARSE_URL を使用:

$x = parse_url($url);
$x['scheme']  ???? 'http'
$x['Host']    ???? 'example.com'
$x['path']    ???? '/myfolder/sympony.mp3'
$x['query']   ???? 'aa=1&bb=2'
$x['fragment']???? 'XYZ'             

注:ハッシュタグはサーバーサイドでは使用できません。手動で追加した場合のみです。


すべてのネイティブPHPの例については、以下を参照してください。 PHP で完全なURLを取得する

84
T.Todua

SplFileInfo もあります。

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

文字列ではなくそのようなオブジェクトを渡した方が良いコードを書くことができる場合が多く、その場合はコードのほうが話しやすいです。 PHP 5.4以降、これはワンライナーです。

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

E満足応答は、ファイル拡張子を判断するための正しい方法です。

あるいは、ファイル拡張子に頼らずに、ファイル情報( http://us2.php.net/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;
}
20
Toxygene

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) を使用している場合に拡張子を取得するもう1つの方法(PHP 4> = 4.0.3、PHP 5) is 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"

//編集:ブラケットを削除しました

12
Subodh Ghulaxe

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

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

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

9
Anonymous

pathinfo($path, PATHINFO_EXTENSION)を使用しない方が便利なことがあります。次に例を示します。

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

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

また、pathinfoは、通常は問題にはならないが、その警告に気づいていても害がないという拡張において、いくつかの非ASCII文字を扱うことができないことに注意してください。

9
Alix Axel

Phpでファイル拡張子を取得する最も簡単な方法は、php組み込み関数 pathinfo を使用することです。

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // the out should be extension of file eg:-png, gif, html
7
Shahbaz

簡単な修正はこのようなものです。

    //exploding the file based on . 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];
5
Bilja
substr($path, strrpos($path, '.') + 1);
5
Kurt Zhong

これが例です。$ filenameが "example.txt"だとします。

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

そのため、$ extは ".txt"になります。

4
G. I. Joe

あなたもこれを試すことができます
(php 5. *および7に取り組む)

$info = new SplFileInfo('test.Zip');
echo $info->getExtension(); // ----- Output -----> Zip

ヒント:ファイルに拡張子がない場合は空の文字列を返します
楽しめ ;)

4
pooya_sabramooz

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

$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";  
4
Arshid KV

これはうまくいくでしょう

$ext = pathinfo($filename, PATHINFO_EXTENSION);
3
Deepika Patel

pathinfo()SplFileInfoの解決策はローカルファイルシステム上の標準ファイルにはうまくいくことがわかりましたが、有効な画像のURLが#(フラグメント識別子)や?を持っているのでリモートファイルを扱う場合は困難に直面する可能性があります。 URLの末尾にある(クエリパラメータ)。どちらの解決方法も(正しくない)ファイル拡張子の一部として処理されます。

私はこれがファイル拡張子の後に不要な雑然とを取り除くために最初にそれを解析した後にpathinfo()を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()
3
Jonathan Ellis

なぜsubstr($path, strrpos($path,'.')+1);を使わないのですか?それはすべての比較の最速の方法です。 @Kurt Zhongはすでに答えています。

ここで比較結果を確認しましょう: https://eval.in/661574

2
Abbas

あなたもこれを試すことができます:

 pathinfo(basename( $_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION)
2
smile 22121

「最善の方法」は議論の余地がありますが、私はこれがいくつかの理由で最善の方法であると思います。

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. それは拡張子に対する複数の部分、例えばtar.gzで動作します
  2. 短くて効率的なコード
  3. ファイル名と完全パスの両方で機能します。
1
Dan Bray

あなたは特定のフォルダ上のすべてのファイル拡張子を取得し、特定のファイル拡張子で操作を行うことができます

<?php
    $files=glob("abc/*.*");//abc is 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 perticular extenstion type
        if($extension=='html'){
            //do operation
        }
    endfor;
    print_r($ext);
?>
1

もしあなたがスピードを探しているなら(例えばルーターの中で)、あなたはおそらく全てをトークン化したくないでしょう。他の多くの答えは/root/my.folder/my.cssで失敗するでしょう

ltrim(strrchr($PATH, '.'),'.');
1
Ray Foss

IMOこれはあなたがname.name.name.extのようなファイル名を持っている場合には最良の方法です(醜いが時々起こる)

$ext     = explode( '.', $filename ); //explode the string
$ext_len = count( $ext ) - 1; //count the array -1 (becouse count() starts from 1)
$my_ext  = $ext[ $ext_len ]; //get the last entry of the array

echo $my_ext;
0
Tommy89

実際、私はそれを探していました。

<?php

$url = 'http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ';
$tmp = @parse_url($url)['path'];
$ext = pathinfo($tmp, PATHINFO_EXTENSION);

var_dump($ext);
0
Fred

ltrim(strstr($file_url, '.'), '.')

これは、name.name.name.extのようなファイル名を持っている場合の最良の方法です(butい、しかし時々起こる

0
Anjani Barnwal