Как получить расширение файла в PHP?
У меня возникла проблема с получением расширения файла на 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];
и так далее.
Тем не менее, мне кажется, что всегда существует "лучший способ" решения этой задачи. Каков наиболее эффективный и надежный метод для извлечения расширения файла в PHP?
5 ответ(ов)
Делай это быстрее!
Другими словами, если вы работаете только с именем файла, перестаньте использовать pathinfo
.
Конечно, если у вас есть полный путь, использование pathinfo
оправдано, потому что он более умный, чем просто искать точки: путь может содержать точки, а само имя файла может их не иметь. Поэтому в случае, когда у вас есть строка d:/some.thing/myfile
, pathinfo
и другие полнофункциональные методы — это хороший выбор.
Но если у вас есть только имя файла, без пути, нет смысла заставлять систему работать больше, чем это необходимо. И это может дать вам 10-кратное увеличение скорости.
Вот быстрый тест на скорость:
/* 387 ns */ function method1($s) {return preg_replace("/.*\./","",$s);} // проблемное крайнее значение
/* 769 ns */ function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
/* 67 ns */ function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
/* 175 ns */ function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
/* 731 ns */ function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
/* 732 ns */ function method6($s) {return (new SplFileInfo($s))->getExtension();}
// Все измерения проводились на Linux; на Windows результаты будут значительно отличаться
Эти значения в наносекундах, очевидно, будут отличаться на каждой системе, но они дают четкое представление о пропорциях. SplFileInfo
и pathinfo
отличные инструменты, но для этой задачи нет смысла их использовать. По той же причине explode()
значительно быстрее, чем регулярные выражения. Простые инструменты, как правило, превосходят более сложные.
Заключение
Это кажется путем самурая:
function fileExtension($name) {
$n = strrpos($name, '.');
return ($n === false) ? '' : substr($name, $n+1);
}
Помните, что это только для простых имен файлов. Если есть пути, используйте pathinfo
или обрабатывайте dirname
отдельно.
Вы можете использовать следующий код, если строка не содержит путь к файлу:
array_pop(explode('.', $fname))
Где $fname
— это имя файла, например: my_picture.jpg
. В результате вы получите: jpg
.
Иногда бывает полезно не использовать pathinfo($path, PATHINFO_EXTENSION)
. Например:
$path = '/path/to/file.tar.gz';
echo ltrim(strstr($path, '.'), '.'); // tar.gz
echo pathinfo($path, PATHINFO_EXTENSION); // gz
Обратите внимание, что pathinfo
не справляется с некоторыми не-ASCII символами (обычно он просто игнорирует их в выводе). В большинстве случаев это не является проблемой, но полезно помнить об этом нюансе.
Имейте в виду, что у вас короткий вопрос, но ответ требует более подробного объяснения. Вы хотите извлечь имя файла и его расширение из пути или URL, и вот пример того, как это можно сделать с помощью PHP.
Пример 1: Работа с путём к файлу
$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> Имя: %s <br> Расширение: %s', $name, $ext);
В данном примере мы используем функцию pathinfo()
, чтобы получить имя файла и его расширение из заданного пути. Мы передаем путь к файлу и добавляем константы PATHINFO_FILENAME
и PATHINFO_EXTENSION
для получения соответствующей информации. Вывод будет следующим:
Имя: base.min
Расширение: css
Пример 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> Имя: %s <br> Расширение: %s', $name, $ext);
Во втором примере с URL мы сначала обрабатываем URL с помощью функции parse_url()
, чтобы получить путь к файлу. Затем мы снова используем pathinfo()
для извлечения имени файла и его расширения. Вывод будет таковым:
Имя: file.bak
Расширение: php
Ссылки для дальнейшего чтения
Обратите внимание, что ссылки ведут на официальную документацию PHP, где вы найдете более подробное объяснение функций и возможные варианты использования.
Вы также можете попробовать это (это работает на PHP 5.* и 7):
$info = new SplFileInfo('test.zip');
echo $info->getExtension(); // ----- Результат -----> zip
Совет: если у файла нет расширения, метод вернет пустую строку.
Когда использовать 'self' вместо '$this'?
Как вывести ошибки PHP на экран?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?