Это вопрос, который вы можете прочитать повсюду в Интернете с различными ответами:
$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
$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'
$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, '.'))
для быстрого поиска извлечения (если вы точно знаете, что у вашего имени файла есть один).