PHP获取与模式匹配的文件列表,并按最旧文件

时间:2015-11-13 00:57:12

标签: php regex file directory glob

如果我有一个目录,其中文件列表如下所示:

Something_2015020820.txt
something_5294032944.txt.a
something_2015324234.txt
Something_2014435353.txt.a

我希望得到文件列表按最早的日期排序(不是文件名),结果应该采取与something_xxxxxxx.txt匹配的任何内容。因此,任何以“.a”结尾的内容都不包括在内。在这种情况下,它应该返回

Something_2015020820.txt
something_2015324234.txt

我做一些谷歌搜索,似乎我可以使用glob

$listOfFiles = glob($this->directory . DIRECTORY_SEPARATOR . $this->pattern . "*");

但我不确定这种模式。

如果你能同时提供区分大小写和不敏感的模式,那就太棒了。匹配模式必须是something_number.txt

2 个答案:

答案 0 :(得分:2)

使用glob有点棘手。它确实支持一些有限的模式匹配。例如,您可以

glob("*.[tT][xX][tT]");

这将匹配file.txtfile.TXT,但它也会匹配file.tXtfile.TXt。遗憾的是,无法指定file.(txt or TXT)之类的内容。如果这不是问题,太棒了!否则,您必须首先使用此方法至少缩小结果范围,然后再执行一些额外的处理。 array_filter和一些正则表达式可能。

更好的选择可能是使用PHP的Iterator类,因此您可以指定更高级的规则。

$directoryIterator = new RecursiveDirectoryIterator($directory);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator);
$fileList = new RegexIterator($iteratorIterator, '/^.*\.(txt|TXT)$/');
foreach($fileList as $file) {
    echo $file;
}

答案 1 :(得分:1)

您可以使用scandir获取所有文件。然后preg_match将这些文件过滤为不以.a结尾的文件。然后filemtime可用于拉取文件上次修改的时间。然后可以使用array_multisort在文件上次修改时进行排序,并保持密钥/文件名关联。

这符合我的预期:

date_default_timezone_set('America/New_York'); //change to your timezone
$directory = 'Your Directory';
$files = scandir($directory);
foreach($files as $file) {
    if(!preg_match('~\.a$~', $file) && !is_dir($directory . $file)) {
        $time["$file"] = filemtime($upload_directory . $file);
    }
}
array_multisort($time);

然后,为了处理输出,您可以执行以下操作:

foreach($time as $file => $da_time){
    echo $file . ' '. date('m/d/Y H:i:s', $da_time) . "\n";
}

preg_match可以在i分隔符后添加~,因此正则表达式不区分大小写;或者您可以将a更改为[aA]