Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将RecursiveDirectoryIterator与修改的日期筛选器一起使用?_Php_Regex_Directory - Fatal编程技术网

Php 如何将RecursiveDirectoryIterator与修改的日期筛选器一起使用?

Php 如何将RecursiveDirectoryIterator与修改的日期筛选器一起使用?,php,regex,directory,Php,Regex,Directory,我正在尝试读取我们服务器上的所有文件(>2M个文件),并在使用Regex将其过滤为PHP和HTML文件方面取得了很大的进展。我的日子一直在尝试复制文件修改或创建时间的过滤,而不是用这个文件名,但似乎找不到一种方法来传递我想要比较的日期 以下是我的工作起点: abstract class FilesystemRegexFilter extends RecursiveRegexIterator { protected $regex; public function __constru

我正在尝试读取我们服务器上的所有文件(>2M个文件),并在使用Regex将其过滤为PHP和HTML文件方面取得了很大的进展。我的日子一直在尝试复制文件修改或创建时间的过滤,而不是用这个文件名,但似乎找不到一种方法来传递我想要比较的日期

以下是我的工作起点:

abstract class FilesystemRegexFilter extends RecursiveRegexIterator {
    protected $regex;
    public function __construct(RecursiveIterator $it, $regex) {
        $this->regex = $regex;
        parent::__construct($it, $regex);
    }
}
class FilenameFilter extends FilesystemRegexFilter {
    public function accept() {
        return ( ! $this->isFile() || preg_match($this->regex, $this->getFilename()));
    }
}
class DirnameFilter extends FilesystemRegexFilter {
    public function accept() {
        return ( ! $this->isDir() || preg_match($this->regex, $this->getFilename()));
    }
}

$directory = new RecursiveDirectoryIterator("c:\\www");
$filter = new DirnameFilter($directory, '/^(?!cache)/');
$filter = new FilenameFilter($filter, '/\.(?:php|inc)$/');
foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
    echo $filename . PHP_EOL;
}
这就是我试图通过复制/粘贴使用正则表达式的代码来实现的“伪代码”

abstract class FilesystemDateFilter extends RecursiveSOMEKINDOFIterator {
    protected $earliest_date;
    public function __construct(RecursiveIterator $it, $earliest_date) {
        $this->earliest_date = $earliest_date;
        parent::__construct($it, $earliest_date);
    }
}
class FiledateFilter extends FilesystemDateFilter {
    // Filter files against the Earliest Date
    public function accept() {
        return ( ! $this->isFile() || $this->getMTime() >= $this->earliest_date );
    }
}

$filter = new FilenameFilter($filter, '/\.(?:php|inc)$/');
$filter = new FiledateFilter($filter, '2012-12-31');

问题是示例代码中只能使用有效的正则表达式,对于我尝试过的其他类,在其构造中不允许使用第二个参数。我似乎找不到正确的替代方法来替代
RecursiveRegexIterator
,该方法允许我传递一个日期值,以便在上周创建/修改的PHP/HTML文件中包含过滤器进行比较。

好的,您可以尝试以下示例:

class FilesystemDateFilter extends RecursiveFilterIterator 
{
  protected $earliest_date;

  public function __construct(RecursiveIterator $it, $earliest_date) 
  {
      $this->earliest_date = $earliest_date;
      parent::__construct($it);
  }

  public function accept() 
  {
      return ( ! $this->isFile() || $this->getMTime() >= $this->earliest_date );
  }

  public function getChildren() 
  {
      return new static ( $this->getInnerIterator ()->getChildren (), $this->earliest_date );
  }   
}

$directory = new RecursiveDirectoryIterator("c:\\www");
$filter = new FilesystemDateFilter($directory, strtotime('2012-12-31'));

foreach(new RecursiveIteratorIterator($filter) as $filename => $file) {
   echo $filename . PHP_EOL;
}
注意:返回时间戳,所以您也需要给出它


您缺少的是覆盖将参数向下传递给子级的
getChildern

而不是尝试将其填充到
RecursiveGetExitor
中,您是否考虑过只使用
RecursiveFilterator
来代替它?您不需要将其传递给父级:u构造($it,$earlime\u date);因此,您可以使用递归FilterIterator,我很乐意这样做……我对整个迭代器都不熟悉,我开始的示例使用Regex来过滤文件。这节省了大量的处理时间,因此我从我知道正在工作的代码开始学习。我在谷歌上搜索了你的建议,但当你试图了解迭代器的工作原理时,像“filter”“new”“files”这样的术语并不能准确地返回任何特定的或可用的内容。只需尝试
class FiledateFilter Extendes RecursiveFilterIterator
,声明一个
public$earliestdate
,然后设置它(不是在它的构造函数参数中,因为签名不应该更改)。看看这是怎么回事……哦,天哪,你不想看到我为了完成这项任务而产生的可怕的混乱。要同时过滤文件名,我是否能够立即执行“$filter=new FilenameFilter($filter,“/\”(?:php | inc)$/”;”从最初的示例开始?我将很快尝试它,只是想知道它是否可行,或者是否将其构建到您给出的示例中。我不确定我是否理解您的问题,但您可以将其与您的示例一起使用,您的正则表达式搜索很好。但我仍然坚持这一点:它们都引用$this,它没有getMTime()-如何从accepti函数访问->getMTime()?我在accept函数中获得了时间,没有问题,因为它是DirectoryIterator,只是它的时间戳,我已经更新了示例。唉,我正在使用PHP5.2。需要一些时间来设置5.3环境…谢谢。