Проверка расширений файлов в PHP с помощью регулярных выражений

Я читаю все файлы в одном каталоге, и я хочу фильтровать JPG, JPEG, GIF и PNG.

И капитальные, и маленькие буквы. Это единственные файлы, которые нужно принять.

В настоящее время я использую это:

$testPics = takeFiles($picsDir, "([^\s]+(?=\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF))\.\2)"); 

и функция takeFiles выглядит так:

 function takerFiles($dir, $rex="") { $dir .= "/"; $files = array(); $dp = opendir($dir); while ($file = readdir($dp)) { if ($file == '.') continue; if ($file == '..') continue; if (is_dir($file)) continue; if ($rex!="" && !preg_match($rex, $file)) continue; $files[] = $file; } closedir($dp); return $files; } 

И он всегда ничего не возвращает. Поэтому что-то не так с моим кодом регулярного выражения.

Related of "Проверка расширений файлов в PHP с помощью регулярных выражений"

Я думаю, что что-то не так с вашим регулярным выражением. Попробуйте сначала проверить регулярные выражения: http://www.spaweditor.com/scripts/regex/index.php

Я думаю, что это может сработать для вас:

/^.*\.(jpg|jpeg|png|gif)$/i

Обратите внимание на / i в конце – это флаг «нечувствительный к регистру», избавляет вас от необходимости вводить все перестановки 🙂

Как насчет использования glob () вместо этого?

 $files = glob($dir . '*.{jpg,gif,png,jpeg}',GLOB_BRACE); 

Есть ли причина, по которой вы не хотите использовать scandir и pathinfo ?

 public function scanForFiles($path, array $exts) { $files = scanDir($path); $return = array(); foreach($files as $file) { if($file != '.' && $file != '..') { if(in_array(pathinfo($file, PATHINFO_EXTENSION), $exts))) { $return[] = $file; } } } return $return; } 

Таким образом, вы также можете проверить, является ли файл каталогом и выполнить рекурсивный вызов для сканирования этого каталога. Я написал код в спешке, поэтому может быть не на 100% правильным.

Вы должны поместить косые черты вокруг своего регулярного выражения. -> "/(…)/"

Это работает для меня

 $string = "your-file-name.jpg"; preg_match("/\b(\.jpg|\.JPG|\.png|\.PNG|\.gif|\.GIF)\b/", $string, $output_array); 

Лучший.

Есть несколько способов сделать это.

Вы пробовали glob () ?:

 $files = glob("{$picsDir}/*.{gif,jpeg,jpg,png}", GLOB_BRACE); 

Вы рассматривали pathinfo () ?:

 $info = pathinfo($file); switch(strtolower($info['extension'])) { case 'jpeg': case 'jpg': case 'gif': case 'png': $files[] = $file; break; } 

Если вы настаиваете на использовании обычного выражения, нет необходимости сопоставлять полное имя файла, просто расширение. Используйте $ token для соответствия концу строки и используйте флаг i для обозначения нечувствительности к регистру. Кроме того, не забудьте использовать разделитель в вашем выражении, в моем случае «%»:

 $rex = '%\.(gif|jpe?g|png)$%i'; 

Вот два разных способа скомпилировать массив файлов по типу (conf для демонстрации) из целевого каталога. Я не уверен, какая из них лучше.

  $path = '/etc/apache2/'; $conf_files = []; // Remove . and .. from the returned array from scandir $files = array_diff(scandir($path), array('.', '..')); foreach($files as $file) { if(in_array(pathinfo($file, PATHINFO_EXTENSION), ['conf'])) { $conf_files[] = $file; } } return $conf_files; 

Это вернет полный путь к файлу, а не только имя файла

 return $files = glob($path . '*.{conf}',GLOB_BRACE);