#php #file #search #glob
#php #структура каталогов #расширение файла #scandir #изображение-файл
Вопрос:
Есть ли какой-либо способ получить только изображения с расширениями jpeg
, png
, gif
и т.д. при использовании
$dir = '/tmp';
$files1 = scandir($dir);
Ответ №1:
Вы можете использовать glob
$images = glob('/tmp/*.{jpeg,gif,png}', GLOB_BRACE);
Если вам нужно, чтобы это было нечувствительно к регистру, вы можете использовать a DirectoryIterator
в сочетании с a RegexIterator
или передать результат scandir
to array_map
и использовать обратный вызов, который фильтрует любые нежелательные расширения. Используете ли вы strpos
fnmatch
расширение или pathinfo
получаете его, зависит от вас.
Комментарии:
1. Это … больше не используется
scandir()
. Но в остальном правильно. Так разве это не должно быть «нет, сglob
«?2. Теперь сделайте его нечувствительным к регистру. >:)
3. @salathe злое сердце !! : P
4. Но он не поддерживает unicode-charator filename. 🙁
Ответ №2:
Фактический вопрос заключался в использовании scandir, и ответы заканчиваются в glob. Существует огромная разница в обоих случаях, когда blob значительно тяжелее. Ту же фильтрацию можно выполнить с помощью scandir, используя следующий код:
$images = preg_grep('~.(jpeg|jpg|png)$~', scandir($dir_f));
Я надеюсь, что это кому-нибудь поможет.
Комментарии:
1. Это работает хорошо, но регулярное выражение должно иметь «i» после конечной тильды, чтобы сделать его нечувствительным к регистру, чтобы не отфильтровывать имена изображений / графических файлов с расширениями верхнего регистра, такими как . PNG или .JPG
Ответ №3:
Вот простой способ получить только изображения. Работает с PHP> = 5.2 версии. Коллекция расширений указана в нижнем регистре, поэтому преобразование расширения файла в цикле в нижний регистр делает его нечувствительным к регистру.
// image extensions
$extensions = array('jpg', 'jpeg', 'png', 'gif', 'bmp');
// init result
$result = array();
// directory to scan
$directory = new DirectoryIterator('/dir/to/scan/');
// iterate
foreach ($directory as $fileinfo) {
// must be a file
if ($fileinfo->isFile()) {
// file extension
$extension = strtolower(pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION));
// check if extension match
if (in_array($extension, $extensions)) {
// add to result
$result[] = $fileinfo->getFilename();
}
}
}
// print result
print_r($result);
Я надеюсь, что это полезно, если вам нужны расширения без учета регистра и только для изображений.
Ответ №4:
Я бы перебрал файлы и посмотрел их расширения:
$dir = '/tmp';
$dh = opendir($dir);
while (false !== ($fileName = readdir($dh))) {
$ext = substr($fileName, strrpos($fileName, '.') 1);
if(in_array($ext, array("jpg","jpeg","png","gif")))
$files1[] = $fileName;
}
closedir($dh);
Ответ №5:
Вы можете выполнить поиск в результирующем массиве позже и отбросить файлы, не соответствующие вашим критериям.
scandir
не имеет функциональности, которую вы ищете.
Ответ №6:
Если вы хотите сканировать каталог и возвращать только имена файлов, вы можете использовать это:
$fileNames = array_map(
function($filePath) {
return basename($filePath);
},
glob('./includes/*.{php}', GLOB_BRACE)
);
scandir()
вернет .
и ..
, а также файлы, поэтому приведенный выше код будет более чистым, если вам нужны только имена файлов или вы хотите сделать другие вещи с фактическими путями к файлам
Ответ №7:
Я написал код, повторно используя и объединяя части решений, приведенных выше, чтобы упростить его понимание и использование:
<?php
//put the absolute or relative path to your target directory
$images = scandir("./images");
$output = array();
$filer = '/(.jpg|.png|.jpeg|.gif|.bmp))/';
foreach($images as $image){
if(preg_match($filter, strtolower($image))){
$output[] = $image;
}
}
var_dump($output);
Комментарии:
1. Это не работает:
Compilation failed: unmatched closing parenthesis
2. В $filter в строке 5 есть одна дополнительная скобка. Также это неправильно написано как $filer . В противном случае, похоже, работает нормально!