Это вопрос, который вы можете прочитать повсюду в Интернете с различными ответами:
$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];
и т.п.
Однако всегда есть «лучший способ», и он должен быть в Stack Overflow.
Еще один способ получить ext - strrchr($filename, '.');.
strrpos - правильный способ (см. мой ответ), но для случая без расширения он нуждается в дополнении.






$path_info = pathinfo('/foo/bar/baz.bill');
echo $path_info['extension']; // "bill"
Начиная с PHP 5.5 -> echo pathinfo('/foo/bar/baz.bill')['extension'];
Это работает даже на этом уровне (Twitter json): $ ext = pathinfo ($ result-> extended_entities-> media [0] -> video_info-> v ariants [1] -> url, PATHINFO_EXTENSION);
Люди из других языков сценариев всегда думают, что их язык лучше, потому что для этого у них есть встроенная функция, а не PHP (сейчас я смотрю на Pythonistas :-)).
На самом деле он существует, но мало кто об этом знает. Встречайте pathinfo():
$ext = pathinfo($filename, PATHINFO_EXTENSION);
Это быстро и встроено. pathinfo() может предоставить вам другую информацию, например канонический путь, в зависимости от константы, которую вы ему передаете.
Помните, что если вы хотите иметь возможность работать с символами, отличными от ASCII, вам необходимо сначала установить языковой стандарт. НАПРИМЕР:
setlocale(LC_ALL,'en_US.UTF-8');
Также обратите внимание, что это не принимает во внимание содержимое файла или тип mime, вы получаете только расширение. Но это то, о чем вы просили.
Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути к ресурсам URL, который покрывается с помощью PARSE_URL.
Наслаждаться
мой pathinfo отключен, а затем короткий способ извлечения строки расширения?
@khizaransari Вам стоит поискать другого хостинг-провайдера, тот, который у вас есть, глупый. На самом деле, я серьезно. Для отключения этой функции есть без причины. Скажи им это. В качестве обходного пути: function get_ext($fname){ return substr($fname, strrpos($fname, ".") + 1); } Убедитесь, что файл имеет расширение, хотя он может делать что угодно, если вы передаете путь в качестве аргумента!
У меня проблема с этим примером - он не работает с такими именами, как "............. doc", есть идеи, почему?
мое представление о PHP по сравнению с python полностью изменилось теперь, когда я знаю об этой функции: O
@ e-satis, но он не работает в одном сценарии в моем приложении.Как иногда я получаю URL-адрес в следующем формате, www.domain.com/image.php?id=123&idlocation=987&number=01 для загрузки изображений, поскольку этот uRL не имеет имени изображения или расширения, с которым pathifo () отказывается дайте нам расширение изображения. ТАК что делать, пожалуйста !!! Помоги мне
Это действительно несправедливо, что я не потратил впустую столько, сколько другие люди здесь, а вместо этого нашел этот ответ и быстро решил свою проблему.
Это НЕ безопасное решение. Если кто-то загрузил на вашу конечную точку без использования браузера, он может подделать расширение. Например: pathinfo ('image.jpg.spoofed', PATHINFO_EXTENSION) возвращает 'spoofed' !! Он не проверяет фактическое тело файла, поскольку не принимает путь к файлу и не проверяет свой результат с помощью карты MimeType. Вы должны убедиться, что значение, которое вы получаете от этого, действительно является допустимым типом, запросив iana.org/assignments/media-types/media-types.txt или проверив свою собственную карту MimeType.
Ответ E-satis - это правильный способ определить расширение файла.
В качестве альтернативы, вместо того, чтобы полагаться на расширение файлов, вы можете использовать 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;
}
Это ЕДИНСТВЕННЫЙ правильный ответ. Я не понимаю, почему люди голосовали за других. Да, такой подход требует от разработчика больших усилий, но повышает производительность (хотя и немного, но дает). Пожалуйста, обратитесь к это.
@Bhavik: В некоторых случаях нам может понадобиться только расширение файла, они касаются проверки типа mime. Но на самом деле вопрос касается расширения файла, а не типа файла. Так что это НЕ лучший ответ на этот вопрос. (пока нет ответа)
Если он не содержит пути, вы также можете использовать:
array_pop(explode('.', $fname))
Где $fname - это имя файла, например: my_picture.jpg.
И результат будет: jpg
@ Почему здесь 3 голоса против? это дает правильный результат. Пожалуйста, объясни
В этом нет ничего плохого, просто это не лучший способ сделать это. Проголосовали за немного баланса.
Это лучший способ, когда вам нужно настоящее расширение, а имя файла может содержать несколько., Например, загруженные пользователем фотографии в моем случае.
Это не удается, если имя файла не имеет расширения. Попробуйте передать «myfile», и он вернет «myfile». Правильное возвращаемое значение - это пустая строка в качестве расширения в этом случае использования.
Это неправильно, потому что array_pop () выдаст уведомление, потому что он принимает указатель в качестве параметра.
$file = new SplFileInfo($path);
$ext = $file->getExtension();
Часто можно написать лучший код, если передать такой объект вместо строки. Тогда ваш код более говорящий. Начиная с PHP 5.4 это однострочный:
$ext = (new SplFileInfo($path))->getExtension();
Фантастический, его объекты полностью вниз :)
Имейте в виду, что ->getExtension() доступен в SplFileInfo, начиная с PHP 5.3.6.
@matthias: Имейте в виду, что SPL можно отключить в версиях PHP, предшествующих выпуску PHP 5.3.0. Если вы все еще не используете PHP 5.3, но 5.2 или ниже, этот ответ, скорее всего, не подходит для стабильного кода. В противном случае вы можете стабилизировать свой код, потребовав конкретную версию PHP, и в противном случае выйти из строя.
@hakre Хотя вы правы, говоря, что «может быть отключено в версиях, предшествующих 5.3.0», расширение SPL, тем не менее, компилируется по умолчанию, начиная с PHP 5.0.0. Так что этот комментарий действительно имеет смысл для людей, вынужденных использовать PHP 5.2 или ниже и не желающих отказываться от использования определенных классов SPL.
ага просто мертвый вариант пух :)
$ext = pathinfo($file, PATHINFO_EXTENSION) или $ext = pathinfo($file)['extension'] лучше однострочники.
Иногда бывает полезно не использовать pathinfo($path, PATHINFO_EXTENSION). Например:
$path = '/path/to/file.tar.gz';
echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz
Также обратите внимание, что pathinfo не может обрабатывать некоторые символы, отличные от ASCII (обычно он просто подавляет их из вывода). В расширениях это обычно не проблема, но знать об этом нюансе не помешает.
@ e-satis: Согласно Википедия это два расширения: Файловые системы, подобные UNIX, используют другую модель без отдельных метаданных расширений. Точка - это просто еще один символ в главном имени файла, а имена файлов могут иметь несколько расширений, обычно представляющих вложенные преобразования, такие как files.tar.gz.
А если в названии товара есть точка? Пример: test.19-02-2014.jpeg
Это не удастся с /root/my.folder/my.css ltrim(strrchr($PATH, '.'),'.') работает как pathinfo, но без токенизации всего.
Использовать
str_replace('.', '', strrchr($file_name, '.'))
для быстрого поиска расширений (если вы точно знаете, что у вашего файла оно есть).
substr($path, strrpos($path, '.') + 1);
Это не удастся с /root/my.folder/my.css
Это должно работать правильно: substr ($ path, strrpos ($ path, '.') + 1); Примечание: этот метод работает быстрее, чем любые другие решения, указанные выше. Попробуйте выполнить тест, используя наш собственный скрипт.
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"
// Обновлено: удалили скобку
Это будет работать
$ext = pathinfo($filename, PATHINFO_EXTENSION);
Субодх уже ответил на этот вопрос гораздо лучше еще в августе.
Это уже предлагалось еще в 2008 году. Отправляйте ответ только в том случае, если у вас есть что-то уникальное и ценное. Избыточный контент только тратит время исследователей и раздувает страницы Stack Overflow.
Я обнаружил, что решения 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()
Вот пример. Предположим, что $ filename - "example.txt",
$ext = substr($filename, strrpos($filename, '.', -1), strlen($filename));
Таким образом, $ ext будет ".txt".
Самый простой способ получить расширение файла в PHP - использовать встроенную функцию PHP pathinfo.
$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION);
echo ($file_ext); // The output should be the extension of the file e.g., png, gif, or html
Быстрое исправление будет примерно таким.
// Exploding the file based on the . 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];
Почему бы просто не использовать встроенную функцию php для цели php.net/manual/en/function.pathinfo.php вместо использования длинного кода
Помимо точки зрения Шахбаза, вы также можете просто выполнить $file_ext = end(explode('.', $filename));, чтобы сделать все в этом ответе в одной строке вместо четырех.
@Amelia Что делать, если у вас есть .tar.gz. Это не сработает, поэтому, если вам нужно получить полное расширение, используйте, например, ltrim(strstr($filename, '.'), '.');, чтобы получить полное расширение, вместо того, чтобы некорректно, как gz.
Пример URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
А) Не используйте предложенный небезопасный PATHINFO:
pathinfo($url)['dirname'] ? 'http://example.com/myfolder'
pathinfo($url)['basename'] ? 'sympony.mp3?a=1&b=2#XYZ' // <------- BAD !!
pathinfo($url)['extension'] ? 'mp3?a=1&b=2#XYZ' // <------- BAD !!
pathinfo($url)['filename'] ? 'sympony'
Б) Используйте PARSE_URL:
parse_url($url)['scheme'] ? 'http'
parse_url($url)['host'] ? 'example.com'
parse_url($url)['path'] ? '/myfolder/sympony.mp3'
parse_url($url)['query'] ? 'aa=1&bb=2'
parse_url($url)['fragment'] ? 'XYZ'
БОНУС: Посмотреть все нативные примеры PHP
Этот ответ охватывает все, например. такой файл, как foo_folder/foo-file.jpg?1345838509, потерпит неудачу только с pathinfo, спасибо
Не совсем по теме, но это решило мою проблему!
Ничего не забывай! parse_url - это URL, а pathinfo - путь к файлу.
Что значит "забыть информацию о пути"? Вы используете его в решении!
@AutumnLeonard Он этого не делает, он просто показал разницу между pathinfo и parse_url.
для тех, у кого есть проблемы с именами файлов, такими как Webp.net-resizeimage_% 288% 29.png? 1547034073, где у нас есть несколько точек, вы можете использовать функцию php end (), чтобы получить последний элемент массива, который включает формат файла
Вы можете получить все расширения файлов в определенной папке и выполнять операции с определенным расширением файла:
<?php
$files = glob("abc/*.*"); // abc is the 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 particular extension type
if ($extension=='html'){
// Do operation
}
endfor;
print_r($ext);
?>
Вы также можете попробовать это:
pathinfo(basename($_FILES["fileToUpload"]["name"]), PATHINFO_EXTENSION)
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";
Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не захотите токенизировать все. Многие другие ответы потерпят неудачу с /root/my.folder/my.css
ltrim(strrchr($PATH, '.'),'.');
Используйте substr($path, strrpos($path,'.')+1);. Это самый быстрый метод сравнения.
@ Курт Чжун уже ответил.
Проверим сравнительный результат здесь: https://eval.in/661574
Неа. Это не самый быстрый способ, и вы немного удивитесь, если вызовете его с именем файла без расширения.
Вы также можете попробовать это (работает на PHP 5. * и 7):
$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Output -----> zip
Совет: возвращает пустую строку, если файл не имеет расширения.
Хотя «лучший способ» спорен, я считаю, что это лучший способ по нескольким причинам:
function getExt($path)
{
$basename = basename($path);
return substr($basename, strlen(explode('.', $basename)[0]) + 1);
}
tar.gz.Собственно, я этого и искал.
<?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);
IMO, это лучший способ, если у вас есть имена файлов, такие как name.name.name.ext (уродливо, но иногда бывает):
$ext = explode('.', $filename); // Explode the string
$my_ext = end($ext); // Get the last entry of the array
echo $my_ext;
ltrim(strstr($file_url, '.'), '.')
this is the best way if you have filenames like name.name.name.ext (ugly, but it sometimes happens
Пример 1 для PATH
$path = "/home/ali/public_html/wp-content/themes/chicken/css/base.min.css";
$name = pathinfo($path, PATHINFO_FILENAME);
$ext = pathinfo($path, PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);
Пример 2 для URL
$url = "//www.example.com/dir/file.bak.php?Something+is+wrong=hello";
$url = parse_url($url);
$name = pathinfo($url['path'], PATHINFO_FILENAME);
$ext = pathinfo($url['path'], PATHINFO_EXTENSION);
printf('<hr> Name: %s <br> Extension: %s', $name, $ext);
Вывод примера 1:
Name: base.min
Extension: css
Результат примера 2:
Name: file.bak
Extension: php
$ext = preg_replace('/^.*\.([^.]+)$/D', '', $fileName);
preg_replace, мы используем поиск и замену регулярных выражений. В функции preg_replace первый параметр - это шаблон для поиска, второй параметр $ 1 - это ссылка на то, что соответствует первому (. *), А третий параметр - имя файла.
Другой способ, мы также можем использовать strrpos, чтобы найти позицию последнего вхождения символа «.» В имени файла и увеличить эту позицию на 1, чтобы она взорвала строку из (.)
$ext = substr($fileName, strrpos($fileName, '.') + 1);
Вызовы низкого уровня должны быть очень быстро, поэтому я подумал, что стоит провести некоторое исследование. Я пробовал несколько методов (с различной длиной строки, длиной расширения, несколькими запусками каждый), вот несколько разумных:
function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if ($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if ($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
Полученные результаты
были не очень удивительными. Плохой pathinfo (безусловно!) Самый медленный; даже с опцией PATHINFO_EXTENSION похоже, что он пытается все разобрать, а затем отбросить все ненужные части. С другой стороны, встроенная функция strrpos создана почти точно для этой работы, не требует обходных путей, поэтому неудивительно, что она работает намного лучше, чем другие кандидаты:
Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:
Method 1: 312.6 mike (response: txt) // preg_replace
Method 2: 472.9 mike (response: txt) // preg_match
Method 3: 167.8 mike (response: txt) // strrpos
Method 4: 340.3 mike (response: txt) // explode
Method 5: 2311.1 mike (response: txt) // pathinfo <--------- poor fella
ПРИМЕЧАНИЕ: у первого метода есть побочный эффект: он возвращает полное имя, когда нет расширения. Конечно, было бы бессмысленно измерять его с помощью дополнительных strpos, чтобы избежать такого поведения.
Похоже, это Путь Самурая:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}
File name fileExtension()
----------------------------------------
file ""
file. ""
file.txt "txt"
file.txt.bin "bin"
file.txt.whatever "whatever"
.htaccess "htaccess"
(Последний вариант немного особенный; это может быть только расширение или пустое расширение с чистым именем ".htaccess", я не уверен, есть ли для этого правило. Так что я думаю, вы можете использовать оба , если вы знаете, что делаете.)
Большое спасибо за это. Всегда приятно найти эти хорошо исследованные новые ответы на старые вопросы. Экономит время, выясняя, какие методы могут быть устаревшими.
В этом случае методу strrpos может потребоваться еще одна проверка без расширения "имя файла".
@ungalcrys в этом случае substr примет пустую часть, поэтому само расширение будет "", как и должно быть.
Я попробовал одно простое решение, которое может помочь кому-то другому получить только имя файла из URL-адреса, который имеет параметры
<?php
$path = "URL will be here";
echo basename(parse_url($path)['path']);
?>
Спасибо
Источник вопроса и ответа: cowburn.info/2008/01/13/get-file-extension-comparison