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


Answers

Pourquoi ne pas utiliser glob () à la place?

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

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

Les deux majuscules et minuscules. Ce sont les seuls fichiers à être acceptés.

J'utilise actuellement 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 ça ne retourne jamais rien. Donc, quelque chose doit être faux avec mon code regex.




Vous devriez mettre des barres obliques autour de votre expression rationnelle. -> "/(...)/"




Il y a plusieurs façons de le faire.

Avez-vous essayé glob () ?:

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

Avez-vous considéré pathinfo () ?:

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

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

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