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.