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

StackOverflow https://stackoverflow.com/questions/173868

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

и т. д.

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

Это было полезно?

Решение

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

На самом деле он существует, но мало кто о нем знает.Встретиться pathinfo():

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

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

Другие советы

pathinfo()

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

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

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

А также есть SplFileInfo:

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

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

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

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

Альтернативно, вместо того, чтобы полагаться на расширение файла, вы можете использовать информацию о файле (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) является информация о пути

Пример кода

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

// РЕДАКТИРОВАТЬ:снял кронштейн

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

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

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

Иногда полезно не использовать 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. информация о пути.

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

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

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

Вот пример: предположим, что $filename — «example.txt».

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

Итак, $ext будет «.txt».

информация о пути является массивом.Мы можем проверить имя каталога, имя файла, расширение и т. д.

$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); ?Это самый быстрый метод из всех сравнений.@Курт Чжун уже ответил.

Давайте проверим сравнительный результат здесь: 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. Он работает как с именем файла, так и с полным путем.

Собственно, я это и искал.

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

ИМО. Это лучший способ, если у вас есть имена файлов типа name.name.name.ext (некрасиво, но иногда случается).

$ext     = explode( '.', $filename ); //explode the string
$ext_len = count( $ext ) - 1; //count the array -1 (becouse count() starts from 1)
$my_ext  = $ext[ $ext_len ]; //get the last entry of the array

echo $my_ext;

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top