Checking for file-extensions in PHP with Regular expressions


Question

I'm reading all the files in a single directory and I want to filter on JPG,JPEG,GIF and PNG.

Both capital and small letters. Those are the only files to be accepted.

I am currently using this:

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

and the function takeFiles looks like this:

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

And it always returns nothing. So something must be wrong with my regex code.

1
16
11/26/2008 3:43:39 PM

Accepted Answer

I think something is wrong with your regex. Try testing regexes here first: https://www.regexpal.com/

I think this one might work for you:

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

Note the /i at the end - this is the "case insensitive" flag, saves you having to type out all permutations :)

33
12/11/2018 6:38:05 PM

How about using glob() instead?

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

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon