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

и т.п.

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

651

Решение

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

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

$ext = pathinfo($filename, PATHINFO_EXTENSION);

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

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

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

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

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

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

+1640

Другие решения

pathinfo()

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

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

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

$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'
$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'

Примечание: хештеги недоступны на стороне сервера, только если они добавлены вручную.


80

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

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

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

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

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;
}
20

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"

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

12

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

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

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

10

Иногда полезно не использовать 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
По вопросам рекламы [email protected]