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

Har*_*rts 3 php regex directory glob file

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

Something_2015020820.txt
something_5294032944.txt.a
something_2015324234.txt
Something_2014435353.txt.a
Run Code Online (Sandbox Code Playgroud)

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

Something_2015020820.txt
something_2015324234.txt
Run Code Online (Sandbox Code Playgroud)

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

$listOfFiles = glob($this->directory . DIRECTORY_SEPARATOR . $this->pattern . "*");
Run Code Online (Sandbox Code Playgroud)

但我不确定模式。

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

rjd*_*own 6

使用 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;
}
Run Code Online (Sandbox Code Playgroud)