2008-11-26 11 views
15

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

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

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

$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; 
    } 

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

ответ

30

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

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

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

Обратите внимание на/я в конце - это «чувствителен к регистру» флаг, позволяет Вам экономить введите все перестановки :)

+1

вам придется бежать точку. – Mark 2008-11-26 15:50:33

+1

Спасибо, Марк, исправлено. D'о! – 2008-11-26 15:55:47

+0

@PhillSacre истек срок действия ссылки на SpawEditor. Не могли бы вы обновить свой ответ? – 2016-12-22 10:56:47

1

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

11

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

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

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

Вы пробовали 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; 
} 

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

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

Есть ли какой-либо причине вы не хотите использовать 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% правильным.

1

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

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

Best.

0

Вот два способа скомпилировать массив файлов по типу (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); 
Смежные вопросы