【问题标题】:PHP get list of files matching a pattern and sort by oldest filePHP获取匹配模式的文件列表并按最旧的文件排序
【发布时间】:2016-02-14 12:46:16
【问题描述】:

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

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

【问题讨论】:

    标签: php regex file directory glob


    【解决方案1】:

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

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

    这将匹配file.txtfile.TXT,但它也将匹配file.tXtfile.TXt。不幸的是,没有办法指定像file.(txt or TXT) 这样的东西。如果这不是问题,那就太好了!否则,您必须首先使用此方法至少缩小结果范围,然后再执行一些额外的处理。 array_filter 和一些正则表达式可能。

    更好的选择可能是使用 PHP 的迭代器类,这样您就可以指定更高级的规则。

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

    【讨论】:

    【解决方案2】:

    您可以使用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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2011-03-08
      • 2016-11-26
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2011-02-01
      相关资源
      最近更新 更多