Как получить (извлечь) расширение файла в PHP?

этот вопрос вы можете прочитать везде в интернете с различными вариантами ответов :

$ext = end(explode('.', $filename));
$ext = substr(strrchr($filename, '.'), 1);
$ext = substr($filename, strrpos($filename, '.') + 1);
$ext = preg_replace('/^.*.([^.]+)$/D', '', $filename);

$exts = split("[/.]", $filename);
$n    = count($exts)-1;
$ext  = $exts[$n];

etc.

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

22 ответов


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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

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


pathinfo()

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

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

использовать безопаснее: PARSE_URL (вместо PATHINFO)


например, 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'         // <------- BAD !!
$x['extension']  'mp3?a=1&b=2'                 // <------- 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'] ''             //<----- this outputs hashtag "XYZ" only in case, when the link containing that hashtag was manually passed to function, because automatically, hashtags are not automatically detectable by PHP

dirname(parse_url($url)['path'])                       /myfolder
basename(parse_url($url))                              sympony.mp3
pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION)  mp3

p.s. обратите внимание, хэштег часть url (т. е. #smth) недоступно в запросе PHP, но только с Яваскрипт.


для полезных примеров, см.: получить полный URL в PHP


появилась SplFileInfo:

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

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

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

e-satis response-правильный способ определить расширение файла.

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

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

/ / EDIT: удалена скобка


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

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

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


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

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

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

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


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

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

вот пример, предположим, что $filename является " примером.txt"

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

таким образом, $ext будет ".txt"


быстрое исправление было бы чем-то вроде этого.

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

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

вы можете попробовать тоже этот
(работа над php 5.* и 7)

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

совет: он возвращает пустую строку, если файл не имеет расширения
наслаждайтесь ;)


Это будет работать

$ext = pathinfo($filename, PATHINFO_EXTENSION);

я обнаружил, что 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()

можно попробовать так :

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

почему бы не использовать substr($path, strrpos($path,'.')+1); ? Это самый быстрый метод сравнения. @Kurt Zhong уже ответил.

давайте проверим сравнительный результат здесь:https://eval.in/661574


вы можете получить все расширение файла в определенной папке и выполнить операцию с конкретным расширением файла

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

Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не хотите все токенизировать. Многие другие ответы потерпят неудачу с /root/my.folder/my.css

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

хотя "лучший способ" спорный, я считаю, что это лучший способ по нескольким причинам:

function getExt($path)
{
    $basename = basename($path);
    return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
  1. он работает с несколькими частями расширения, например tar.gz
  2. короткий и эффективный код
  3. он работает как с именем файла, так и с полным путем

использовать

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

для быстрого извлечения расширения (если вы точно знаете, что ваше имя файла имеет один).