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


723

これは、さまざまな答えでウェブ上のどこでも読むことができる質問です。

$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];

ただし、常に「最良の方法」があり、それはスタックオーバーフロー上にある必要があります。



5
EXTを取得するもう一つの方法ですstrrchr($filename, '.');
verybadbug

回答:


1776

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

楽しい


62
私はこれを二度投票できるといいのですが。pathinfoを使用して置き換えることができたコードの量はわかりません
Mark Biek

8
だから私もそうです。
e-satis

7
ワダヤは知っている、最善の方法があることがわかりました。
Ben

19
@khizaransariあなたは別のホスティングプロバイダーを探すべきです、あなたが得たものは愚かです。本当に、私はそれを意味します。この機能を無効にする理由まったくありません。それらを教えてください。回避策として:function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }ただし、ファイルに拡張子が付いていることを確認してください。引数としてパスを渡すと、ファイルは何でも実行できます。
Luc

12
この関数について知ったので、Pythonと比較したPHPの私の考えは完全に変わりました:O
Tommaso Barbugli 14

166

pathinfo()

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

echo $path_info['extension']; // "bill"

14
PHP 5.5以降->echo pathinfo('/foo/bar/baz.bill')['extension'];
Salman A

1
これはこのレベルでも機能します(Twitter json):$ ext = pathinfo($ result-> extended_entities-> media [0]-> video_info-> variants [1]-> url、PATHINFO_EXTENSION);
KJS

101

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

A)安全でないと思われるものを使用しないでくださいPATHINFO

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

B)PARSE_URLを使用:

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

ボーナス:すべてのネイティブPHPの例を表示


3
この回答はすべてをカバーしています。のようなファイルfoo_folder/foo-file.jpg?1345838509pathinfo、thanx

1
完全に話題になっているわけではありませんが、間違いなく私の問題は解決しました!
ハウィー

7
忘れないで!parse_urlはURL用で、pathinfoはファイルパス用です。
Nabi KAZ 2017年

1
「パス情報を忘れる」とはどういう意味ですか?ソリューションで使用します!
Autumn Leonard

1
@AutumnLeonardそうではなく、pathinfoとparse_urlの違いを示しただけです。

59

またありますSplFileInfo

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

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

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

ファンタスティック、そのオブジェクトはずっと下に:)
クリストファー・チェイス

2
ご了承ください ->getExtension()PHP 5.3.6以降、SplFileInfoで使用できる。
マティアス14

1
@matthias:PHP 5.3.0リリース以前のPHPバージョンではSPLを無効にできることに注意してください。まだPHP 5.3を実行していないが5.2以下を実行している場合、この回答はおそらく安定したコードに適合しませんでした。それ以外の場合は、特定のPHPバージョンを要求することでコードを安定させ、それ以外の場合は救済することができます。
ハクレ

@hakre「5.3.0より前のバージョンでは無効にできる」と言っても間違いありませんが、SPL拡張モジュールはそれでもPHP 5.0.0以降デフォルトでコンパイルされています。そのため、このコメントは、PHP 5.2以下を使用することを余儀なくされ、特定のSPLクラスを使用して辞任したくない人々にとって実際に理にかなっています。
マティアス

ええ、ちょうど死んだバージョンの綿毛:)
ハクレ2014

23

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;
}

1
これが唯一の正解です。なぜ人々が反対票を投じたのか理解できません。はい、このアプローチは開発者によるより多くの努力を要求しますが、それはパフォーマンスを向上させます(少しではありますが、それはします)。こちらを参考にしください 。
Bhavik Shah 2014

2
@Bhavik:場合によっては、ファイル拡張子だけが必要な場合があります。mimeタイプチェックに関するものです。しかし、実際の問題は、ファイルタイプではなく、ファイル拡張子に関するものです。したがって、これはこの質問に対する最良の答えではありません。(まだ回答)
Sasi varna kumar

このスイッチには追加の括弧が必要です
rsb2097 2016

16

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

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

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


@なぜこれには3つの反対票があるのですか?その適切な結果を与える。説明してください
railsbox 2014年

それは間違いではなく、それを行うための最良の方法ではありません。少しバランスが取れています。

これが最良の方法です。実際の拡張子が必要な場合、ファイル名に複数の。を含めることができます。私の場合、ユーザーがアップロードした写真のように。
Rauli Rajande 14

2
ファイル名に拡張子がない場合、これは失敗します。「myfile」を渡してみると、「myfile」が返されます。正しい戻り値は、この使用例では拡張子として空の文字列です。
pmont

これは、array_pop()がポインタをパラメータとして受け取るため、通知をスローするので間違っています。
jurchiks 2015

12

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"

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


12

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

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

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

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


6
@ e-satis:Wikipediaによると、これらは2つの拡張機能です。UNIXのようなファイルシステムは、分離された拡張メタデータなしで異なるモデルを使用します。ドット文字はメインファイル名の単なる別の文字であり、ファイル名には複数の拡張子を付けることができます。通常は、files.tar.gzなどのネストされた変換を表します。
Alix Axel

1
また、製品名にドットがある場合はどうでしょうか。例:test.19-02-2014.jpeg
マリオ・ラドマナナ2014年

これは/root/my.folder/my.cssで失敗します。pathinfoのltrim(strrchr($PATH, '.'),'.')ように機能しますが、すべてをトークン化しません。
Ray Foss

8

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

$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html

8

あなたもこれを試すことができます(それはPHP 5. *と7で動作します):

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

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


7

申し訳ありません...「短い質問ですが、短い答えではありません」

PATHの例1

$path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
$name = pathinfo($path, PATHINFO_FILENAME);
$ext  = pathinfo($path, PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

URLの例2

$url = "//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
$url = parse_url($url);
$name = pathinfo($url['path'], PATHINFO_FILENAME);
$ext  = pathinfo($url['path'], PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);

例1の出力:

Name: base.min
Extension: css

例2の出力:

Name: file.bak
Extension: php

参考文献

  1. https://www.php.net/manual/en/function.pathinfo.php

  2. https://www.php.net/manual/en/function.realpath.php

  3. https://www.php.net/manual/en/function.parse-url.php


6

クイックフィックスはこのようなものです。

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

長いコードを使用する代わりに、目的のphp.net/manual/en/function.pathinfo.phpにphpの組み込み関数を使用しないのはなぜですか
Shahbaz

1
Shahbazのポイントに加え$file_ext = end(explode('.', $filename));て、この答えのすべてを4行ではなく1行で行うこともできます。
tvanc 2016年

@アメリアあなたが持っている場合.tar.gz。それは機能しないので、拡張機能を完全に取得する必要がある場合は、ltrim(strstr($filename, '.'), '.');誤ってとして拡張機能を完全に取得するなどしてくださいgz
Marin Sagovac、2016年

6

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

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

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


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";

5
substr($path, strrpos($path, '.') + 1);

1
これは/root/my.folder/my.cssで失敗します
Ray Foss

1
これは正しく機能する必要があります:substr($ path、strrpos($ path、 '。')+ 1); 注:この方法は、上記の他のソリューションよりも高速です。独自のスクリプトを使用してベンチマークを試してください。
Abbas

4

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

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

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

これは、name.name.name.ext(醜いですが、ときどき発生します)のようなファイル名がある場合に最適な方法です。



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()

3

を使用しsubstr($path, strrpos($path,'.')+1);ます。これは、すべての比較の中で最速の方法です。

@Kurt Zhongはすでに回答しています。

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


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);
?>

2

もっと早く。

低レベルの呼び出しは非常に高速である必要があるので、調査する価値があると思いました。私はいくつかの方法を試しました(さまざまな文字列の長さ、拡張子の長さ、それぞれ複数の実行)、ここにいくつかの合理的な方法があります:

function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}

結果 はそれほど驚くべきものではありませんでした。Poor pathinfoは(断然!)最も遅く(彼がすべてを解析してから、すべての不要な部分を削除しようとしているように見えます)-そしてmethod3()(strrpos)が断然最速です:

Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:

    Method 1:   312.6 mike  (response: txt) // preg_replace
    Method 2:   472.9 mike  (response: txt) // preg_match
    Method 3:   167.8 mike  (response: txt) // strrpos
    Method 4:   340.3 mike  (response: txt) // explode
    Method 5:  2311.1 mike  (response: txt) // pathinfo  <--------- poor fella

注:最初のメソッドには副作用があります。拡張子がない場合、名前全体を返します。確かに、この動作を回避するために追加のstrposを使用して測定しても意味がありません。

結論

これは侍の道に似ています。

function fileExtension($s) {
    $n = strrpos($s,".");
    return ($n===false) ? "" : substr($s,$n+1);
}

1

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

ltrim(strrchr($PATH, '.'),'.');

1

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

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

1

IMO、これは、name.name.name.extのようなファイル名がある場合に最適な方法です(醜いですが、ときどき発生します)。

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

echo $my_ext;

1

$ext = preg_replace('/^.*\.([^.]+)$/D', '$1', $fileName);

preg_replaceアプローチでは、正規表現の検索と置換を使用します。preg_replace関数では、最初のパラメーターは検索のパターン、2番目のパラメーター$ 1は最初の(。*)と一致するものへの参照、3番目のパラメーターはファイル名です。

別の方法として、strrposを使用して、最後に出現する「。」の位置を見つけることもできます。(。)から文字列を分解するように、ファイル名にその位置を1つ増やします。

$ext = substr($fileName, strrpos($fileName, '.') + 1);


0

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

<?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);

-1

使用する

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

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

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