Getting a List of Filenames Matching a Pattern

Getting a List of Filenames Matching a Pattern


You want to find all filenames that match a pattern.


Use a FilterIterator subclass with DirectoryIterator. The FilterIterator subclass needs its own accept( ) method that decides whether or not a particular value is acceptable. The code in Figure only accepts filenames that end with common extensions for images.

Using a FilterIterator

class ImageFilter extends FilterIterator {
    public function accept() {
        return preg_match('@\.(gif|jpe?g|png)[email protected]',$this->current());
foreach (new ImageFilter(new DirectoryIterator('/usr/local/images')) as $img) {
    print "<img src='".htmlentities($img)."'/>\n";


The FilterIterator encloses a DirectoryIterator and only allows certain elements to emerge. It's up to the accept( ) method to return true or false to indicate whether a particular element (accessed with $this->current( )) is OK. In Figure, accept( ) uses a regular expression to make that determination, but your code can use any logic you like.

If your pattern can be expressed as a simple shell "glob" (e.g. *.*), use the glob( ) function to get the matching filenames. Figure finds all the text files in a particular directory.

Using glob( )

foreach (glob('/usr/local/docs/*.txt') as $file) {
   $contents = file_get_contents($file);
   print "$file contains $contents\n";

The glob( ) function returns an array of matching full pathnames. If no files match the pattern, glob( ) returns false.

See Also

Recipe 24.9 details iterating through each file in a directory recursively; documentation on FilterIterator at and on glob( ) at; information about shell pattern matching is available at

 Python   SQL   Java   php   Perl 
 game development   web development   internet   *nix   graphics   hardware 
 telecommunications   C++ 
 Flash   Active Directory   Windows