Как получить (извлечь) расширение файла в PHP? - PullRequest
667 голосов
/ 06 октября 2008

Это вопрос, который вы можете прочитать везде в Интернете с различными ответами:

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

и т.д.

Однако всегда есть «лучший путь», и он должен быть в переполнении стека.

Ответы [ 24 ]

1682 голосов
/ 06 октября 2008

Люди из других языков сценариев всегда думают, что их лучше, потому что у них есть встроенная функция, а не PHP (я сейчас смотрю на Pythonistas: -)).

На самом деле, оно существует, но мало кто это знает. Встречайте pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Это быстро и встроенно. pathinfo() может дать вам другую информацию, такую ​​как канонический путь, в зависимости от константы, которую вы ей передаете.

Помните, что если вы хотите иметь возможность работать с не ASCII-символами, вам необходимо сначала установить локаль. Например:

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

Кроме того, обратите внимание, что это не принимает во внимание содержимое файла или тип mime, вы получаете только расширение. Но это то, что вы просили.

Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути к ресурсам URL, который покрывается с помощью PARSE_URL.

Наслаждайтесь

149 голосов
/ 06 октября 2008

pathinfo()

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

echo $path_info['extension']; // "bill"
84 голосов
/ 17 июля 2015

пример URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ

Для URL не используйте 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 см .: Получить полный URL в PHP

53 голосов
/ 17 октября 2012

Существует также SplFileInfo:

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

Часто вы можете написать лучший код, если вы передаете такой объект вместо строки, тогда ваш код будет более понятным. Начиная с PHP 5.4 это однострочный текст:

$ext  = (new SplFileInfo($path))->getExtension();
20 голосов
/ 06 октября 2008

E-удовлетворительный ответ - правильный способ определения расширения файла.

В качестве альтернативы, вместо того, чтобы полагаться на расширение файлов, вы можете использовать fileinfo (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;
}
12 голосов
/ 02 августа 2014

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"

// РЕДАКТИРОВАТЬ: снял скобку

10 голосов
/ 11 августа 2012

Пока он не содержит путь, вы также можете использовать:

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

Где $fname - имя файла, например: my_picture.jpg И результат будет: jpg

9 голосов
/ 01 ноября 2012

Иногда полезно не использовать pathinfo($path, PATHINFO_EXTENSION), например:

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

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

Также обратите внимание, что pathinfo не в состоянии обрабатывать некоторые не-ASCII символы (обычно это просто подавляет их из вывода), в расширениях, которые обычно не являются проблемой, но это не повредит, чтобы знать об этом предупреждении

7 голосов
/ 13 мая 2015

Самый простой способ получить расширение файла в 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
5 голосов
/ 26 мая 2015

Быстрое исправление будет примерно таким.

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