Как получить (извлечь) расширение файла в 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.
наслаждайтесь
использовать безопаснее: 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
вот пример, предположим, что $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
совет: он возвращает пустую строку, если файл не имеет расширения
наслаждайтесь ;)
я обнаружил, что 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()
почему бы не использовать 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);
}
- он работает с несколькими частями расширения, например
tar.gz
- короткий и эффективный код
- он работает как с именем файла, так и с полным путем
использовать
str_replace('.', '', strrchr($file_name, '.'))
для быстрого извлечения расширения (если вы точно знаете, что ваше имя файла имеет один).