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가 아닌 내장 함수를 가지고 있기 때문에 항상 더 나은 것으로 생각합니다 (Pythonistas를 지금보고 있습니다 :-)).

실제로 존재하지만 그것을 아는 사람은 거의 없습니다. 만나다 pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

이것은 빠르고 내장되어 있습니다. pathinfo()전달하는 상수에 따라 표준 경로와 같은 다른 정보를 제공 할 수 있습니다.

비 ASCII 문자를 처리하려면 로케일을 먼저 설정해야합니다. EG :

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

또한 파일 내용이나 MIME 유형을 고려하지 않고 확장명 만 가져옵니다. 그러나 그것은 당신이 요구 한 것입니다.

마지막으로, 이는 PARSE_URL을 사용하여 다루는 URL 자원 경로가 아닌 파일 경로에 대해서만 작동합니다.

즐겨


62
나는 이것을 두 번 투표 할 수 있으면 좋겠다. 나는의 PathInfo 사용하여 교체 할 수있었습니다 얼마나 많은 코드를 말할 수 없다
마크 Biek

8
나도 그래. 내가 여기에 넣었 어!
전자 좌석

7
Whaddaya는 가장 좋은 방법이 있음을 알았습니다.
Ben

19
@khizaransari 당신은 다른 호스팅 공급자를 찾아야합니다. 정말로, 나는 그것을 의미한다. 이 기능을 비활성화 할 이유없습니다 . 그들에게 말해 해결 방법 : function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); }파일에 확장자가 있는지 확인하십시오. 경로를 인수로 전달할 때 파일이 수행 될 수 있습니다!
Luc

12
파이썬에 비해 PHP의 나의 생각은 내가이 기능에 대해 알고 이제 완전히 바뀌 : O
마소 Barbugli

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 December

100

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?1345838509단지와 비참하게 실패합니다 pathinfo, 고맙습니다

1
완전히 주제가 아니지만 내 문제가 해결되었습니다!
Howie

7
아무것도 잊지 마세요! parse_urlURL 용이며 pathinfo파일 경로 용입니다.
Nabi KAZ

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에서 사용할 수 있습니다.
matthias

1
@matthias : PHP 5.3.0 이전의 PHP 버전에서는 SPL을 비활성화 할 수 있습니다. 여전히 PHP 5.3을 실행하지 않고 5.2 이하인 경우이 답변은 안정적인 코드에 적합하지 않을 수 있습니다. 그렇지 않으면 특정 PHP 버전을 요구하여 코드를 안정화하고 구제 할 수 있습니다.
hakre

@hakre "5.3.0 이전의 버전에서는 비활성화 할 수있다"는 말이 맞지만 SPL 확장은 기본적으로 PHP 5.0.0부터 컴파일됩니다. 따라서이 의견은 PHP 5.2 이하를 사용하도록 강요하고 특정 SPL 클래스를 사용하여 사임하고 싶지 않은 사람들에게 실제로 의미가 있습니다.
matthias

그래, 그냥 죽은 버전 보풀 :)
hakre

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

2
@Bhavik : 경우에 따라 파일 확장자 만 필요할 수도 있으며 MIME 유형 검사에 관한 것입니다. 그러나 실제 질문은 파일 형식이 아니라 파일 확장자에 관한 것입니다. 따라서 이것은이 질문에 대한 최선의 대답이 아닙니다. (아직 답변)
Sasi varna kumar

이 스위치는 추가 괄호가 필요합니다
rsb2097

16

경로를 포함하지 않는 한 다음을 사용할 수도 있습니다.

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

어디 $fname예를 들어, 파일의 이름은 다음과 같습니다 my_picture.jpg. 결과는 다음과 같습니다.jpg


@ 왜 다운 보트가 3 개입니까? 적절한 결과를 제공합니다. 설명하십시오
railsbox

그것은 틀린 것이 아니며, 그것을하는 가장 좋은 방법은 아닙니다. 약간의 균형을 유지하도록 찬성했습니다.

이것은 실제 확장명을 필요로 할 때 가장 좋은 방법이며 파일 이름에 여러 개의.이있을 수 있습니다 (예 : 사용자가 사진을 업로드 한 경우).
Rauli Rajande

2
파일 이름에 확장자가 없으면 실패합니다. "myfile"을 전달하면 "myfile"이 반환됩니다. 올바른 반환 값은이 사용 사례에서 확장명으로 빈 문자열입니다.
pmont

이것은 array_pop ()이 포인터를 매개 변수로 사용하기 때문에 통지를 던지므로 잘못되었습니다.
jurchiks

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 에 따르면 두 가지 확장자가 있습니다. UNIX와 유사한 파일 시스템은 분리 된 확장자 메타 데이터없이 다른 모델을 사용합니다. 도트 문자는 기본 파일 이름의 또 다른 문자이며 파일 이름은 일반적으로 files.tar.gz와 같은 중첩 변환을 나타내는 여러 확장명을 가질 수 있습니다 .
Alix Axel

1
제품 이름에 점이 있다면? 예 :test.19-02-2014.jpeg
Mario Radomanana

ltrim(strrchr($PATH, '.'),'.')/root/my.folder/my.css는 pathinfo와 같이 작동하지만 모든 것을 토큰 화하지 않으면 실패 합니다.
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 줄이 아닌 한 줄로 수행 할 수도 있습니다 .
tvanc

@Amelia 만약 당신이 있다면 .tar.gz. 그것은 작동하지 않을 것입니다. 따라서 확장 프로그램 ltrim(strstr($filename, '.'), '.');을 가득 채우는 것과 같이 확장 기능을 충분히 사용해야하는 경우 대신에 gz.
마린 Sagovac

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
이것은
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);}

결과 는 그리 놀랍지 않았습니다. 가난한 사람 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 함수에서 첫 번째 매개 변수는 검색 패턴이며 두 번째 매개 변수 $ 1은 첫 번째 (. *)와 일치하는 항목에 대한 참조이며 세 번째 매개 변수는 파일 이름입니다.

다른 방법으로, 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.