Как получить только изображения, используя scandir в PHP?

#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 . В противном случае, похоже, работает нормально!