18 votes

Vérification des extensions de fichier en PHP avec des expressions régulières

Je lis tous les fichiers dans un seul répertoire et je veux filtrer les fichiers JPG, JPEG, GIF et PNG.

Majuscules et minuscules. Ce sont les seuls fichiers à accepter.

Je suis actuellement en train d'utiliser ceci :

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

et la fonction takeFiles ressemble à ceci :

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

Et cela ne renvoie jamais rien. Donc quelque chose doit être faux avec mon code regex.

0voto

ringmaster Points 952

Il existe quelques façons de le faire.

Avez-vous essayé glob()? :

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

Avez-vous envisagé pathinfo() ?:

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

Si vous insistez pour utiliser l'expression régulière, il n'est pas nécessaire de faire correspondre tout le nom de fichier, juste l'extension. Utilisez le jeton $ pour faire correspondre la fin de la chaîne, et utilisez le drapeau i pour indiquer la sensibilité à la casse. N'oubliez pas non plus d'utiliser un délimiteur dans votre expression, dans mon cas "%":

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

0voto

user2094495 Points 78

Voici deux différentes façons de compiler un tableau de fichiers par type (conf pour la démo) à partir d'un répertoire cible. Je ne suis pas sûr de laquelle est meilleure en termes de performances.

$path = '/etc/apache2/';
$conf_files = [];

// Supprimer . et .. du tableau retourné par 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;

Cela renverra le chemin complet du fichier et pas seulement le nom du fichier

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X