<?php 
/* 
 * This file is part of the File_Iterator package. 
 * 
 * (c) Sebastian Bergmann <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
/** 
 * FilterIterator implementation that filters files based on prefix(es) and/or 
 * suffix(es). Hidden files and files from hidden directories are also filtered. 
 * 
 * @since     Class available since Release 1.0.0 
 */ 
class File_Iterator extends FilterIterator 
{ 
    const PREFIX = 0; 
    const SUFFIX = 1; 
 
    /** 
     * @var array 
     */ 
    protected $suffixes = array(); 
 
    /** 
     * @var array 
     */ 
    protected $prefixes = array(); 
 
    /** 
     * @var array 
     */ 
    protected $exclude = array(); 
 
    /** 
     * @var string 
     */ 
    protected $basepath; 
 
    /** 
     * @param Iterator $iterator 
     * @param array    $suffixes 
     * @param array    $prefixes 
     * @param array    $exclude 
     * @param string   $basepath 
     */ 
    public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL) 
    { 
        $exclude = array_filter(array_map('realpath', $exclude)); 
 
        if ($basepath !== NULL) { 
            $basepath = realpath($basepath); 
        } 
 
        if ($basepath === FALSE) { 
            $basepath = NULL; 
        } else { 
            foreach ($exclude as &$_exclude) { 
                $_exclude = str_replace($basepath, '', $_exclude); 
            } 
        } 
 
        $this->prefixes = $prefixes; 
        $this->suffixes = $suffixes; 
        $this->exclude  = $exclude; 
        $this->basepath = $basepath; 
 
        parent::__construct($iterator); 
    } 
 
    /** 
     * @return bool 
     */ 
    public function accept() 
    { 
        $current  = $this->getInnerIterator()->current(); 
        $filename = $current->getFilename(); 
        $realpath = $current->getRealPath(); 
 
        if ($this->basepath !== NULL) { 
            $realpath = str_replace($this->basepath, '', $realpath); 
        } 
 
        // Filter files in hidden directories. 
        if (preg_match('=/\.[^/]*/=', $realpath)) { 
            return FALSE; 
        } 
 
        return $this->acceptPath($realpath) && 
               $this->acceptPrefix($filename) && 
               $this->acceptSuffix($filename); 
    } 
 
    /** 
     * @param  string $path 
     * @return bool 
     * @since  Method available since Release 1.1.0 
     */ 
    protected function acceptPath($path) 
    { 
        foreach ($this->exclude as $exclude) { 
            if (strpos($path, $exclude) === 0) { 
                return FALSE; 
            } 
        } 
 
        return TRUE; 
    } 
 
    /** 
     * @param  string $filename 
     * @return bool 
     * @since  Method available since Release 1.1.0 
     */ 
    protected function acceptPrefix($filename) 
    { 
        return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); 
    } 
 
    /** 
     * @param  string $filename 
     * @return bool 
     * @since  Method available since Release 1.1.0 
     */ 
    protected function acceptSuffix($filename) 
    { 
        return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); 
    } 
 
    /** 
     * @param  string $filename 
     * @param  array  $subString 
     * @param  int    $type 
     * @return bool 
     * @since  Method available since Release 1.1.0 
     */ 
    protected function acceptSubString($filename, array $subStrings, $type) 
    { 
        if (empty($subStrings)) { 
            return TRUE; 
        } 
 
        $matched = FALSE; 
 
        foreach ($subStrings as $string) { 
            if (($type == self::PREFIX && strpos($filename, $string) === 0) || 
                ($type == self::SUFFIX && 
                 substr($filename, -1 * strlen($string)) == $string)) { 
                $matched = TRUE; 
                break; 
            } 
        } 
 
        return $matched; 
    } 
} 
 
 |