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

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

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

и т.п.

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

Ответ 1

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

На самом деле, оно существует, но мало кто это знает. Познакомьтесь с pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

Помните, что если вы хотите иметь возможность работать с не ASCII-символами, вам нужно сначала установить локаль. НАПРИМЕР:

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

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

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

наслаждаться

Ответ 2

pathinfo()

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

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

Ответ 3

Пример 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

Ответ 4

Также есть SplFileInfo:

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

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

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

Ответ 5

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

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

Ответ 6

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"

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

Ответ 7

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

Ответ 10

Вы также можете попробовать это (это работает на PHP 5. * и 7):

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

Совет: возвращает пустую строку, если файл не имеет расширения

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

Ответ 14

Вот пример. Предположим, что $ filename это "example.txt",

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

Так что $ ext будет ".txt".

Ответ 15

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

Ответ 16

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

Ответ 17

Вы можете попробовать также это:

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

Ответ 18

Используйте substr($path, strrpos($path,'.')+1); , Это самый быстрый метод из всех сравнений.

@Курт Чжун уже ответил.

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

Ответ 19

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

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

Ответ 20

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

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

Ответ 21

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

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

Ответ 22

На самом деле, я искал это.

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

Ответ 23

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;

Ответ 24

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

это лучший способ, если у вас есть имена файлов, такие как name.name.name.ext (некрасиво, но иногда бывает

Ответ 25

Извините... "Короткий вопрос; но НЕ короткий ответ"

Пример 1 для PATH

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

Пример 2 для URL

$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

Ответ 26

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

Подход preg_replace мы используем поиск и замену регулярного выражения. В функции preg_replace первый параметр - это шаблон для поиска, второй параметр $ 1 - это ссылка на все, что соответствует первому (. *), А третий параметр - имя файла.

Другой способ, мы также можем использовать strrpos, чтобы найти позицию последнего вхождения ‘. в имени файла и увеличьте эту позицию на 1, чтобы она взорвалась из строки (.)

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

Ответ 27

Используйте

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

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