Как получить (извлечь) расширение файла в 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]; 

и т.п.

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

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

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

 $ext = pathinfo($filename, PATHINFO_EXTENSION); 

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

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

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

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

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

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

PathInfo ()

Пример…

 $path_info = pathinfo('/foo/bar/baz.bill'); echo $path_info['extension']; // "bill" 

Забудьте PATHINFO , безопаснее: PARSE_URL


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

ps note, Hashtag часть url (т.е. #smth ) недоступна в PHP-запросе, но только с javascript.

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

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

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

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

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

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

Иногда полезно не использовать 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 

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

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

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

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

Вот пример, предположим, что $ filename является "example.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 – массив. Мы можем проверить имя каталога, имя файла, расширение и т. Д.

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

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

 $ext = pathinfo($filename, PATHINFO_EXTENSION); 

Я обнаружил, что решения pathinfo() и SplFileInfo хорошо SplFileInfo для стандартных файлов в локальной файловой системе, но вы можете столкнуться с трудностями, если работаете с удаленными файлами, поскольку URL-адреса для допустимых изображений могут содержать # (идентификаторы фрагментов) и / или ? (параметры запроса) в конце URL-адреса, который оба эти решения будут (некорректно) обрабатывать как часть расширения файла.

Я нашел, что это был надежный способ использования pathinfo() в URL-адресе после первого разбора его, чтобы pathinfo() ненужный беспорядок после расширения файла:

 $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, '.'),'.'); 

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

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

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

использование

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

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