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.

38voto

Phill Sacre Points 16238

Je pense qu'il y a quelque chose qui ne va pas avec votre regex. Essayez d'abord de tester les regex ici: https://www.regexpal.com/

Je pense que celui-ci pourrait fonctionner pour vous:

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

Notez le /i à la fin - c'est le drapeau "insensible à la casse", qui vous évite d'avoir à taper toutes les permutations :)

11voto

Eran Galperin Points 49594

Que diriez-vous d'utiliser glob() à la place ?

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

3voto

smack0007 Points 5215

Y a-t-il une raison pour laquelle vous ne voulez pas utiliser scandir et 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;
}

Vous pourriez également vérifier si le fichier est un répertoire et effectuer un appel récursif pour scanner ce répertoire. J'ai écrit le code rapidement donc il pourrait ne pas être à 100% correct.

2voto

Rodrigo Points 66

Cela fonctionne pour moi

$string = "nom-de-votre-fichier.jpg";
preg_match("/\b(\.jpg|\.JPG|\.png|\.PNG|\.gif|\.GIF)\b/", $string, $output_array);

Meilleures salutations.

1voto

angus Points 1512

Vous devez mettre des slashes autour de votre expression régulière. -> "/(...)/"

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