5

如果有人能给我一个 glob 的正则表达式模式来获取以下文件名,那就太好了:

1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...

返回没有“_thumb”的文件。我有这个模式:

$numericalFiles = glob("$this->path/*_thumb.*");

这给了我所有的“_thumb”。

4

4 回答 4

6

glob()正如您已经清楚地注意到的那样,在处理您对文件匹配有复杂要求的情况下,它并不是最好的。我建议使用 PHP 的 SPL 库并利用DirectoryIterator类。

$iterator = new DirectoryIterator("/dir/path");
foreach ($iterator as $file) {
    if ($file->isFile() && preg_match("/^[0-9]+\./i",$file->getFilename())) {
        echo $file->getFilename();
    }
}

您可以在迭代期间干净地修改您的标准(此外,如果您需要递归目录迭代,也很容易修改迭代器)。

于 2010-01-18T07:32:57.537 回答
3

Glob 模式和正则表达式是不同的。但是 PHP 的 glob 实现并没有实现匹配这些文件所需的模式否定。您将需要使用更大的正面模式,例如[0-9]*.jpg然后过滤结果。

于 2010-01-18T06:53:52.230 回答
3
foreach (glob('[0-9]*') as $filename) {
    if (strpos("$filename","_thumb") === FALSE){
        echo "$filename \n";
    }
}
于 2010-01-18T07:18:01.910 回答
1

除了zombat 对 DirectoryIterator 的使用之外foreach,构建您自己的专用过滤器类以使生活更轻松(参见循环的区别)和更可重用也可能是有意义的。

class DirectoryFilterThumbs extends FilterIterator {
    public function __construct($path) {
        parent::__construct(new DirectoryIterator($path));
    }
    public function accept() {
        // Use regex or whatever you like here
        return ($this->isFile() && strpos($this->getFilename(), "_thumb.") === FALSE);
    }
}

$files = new DirectoryFilterThumbs("/dir/path");
foreach ($files as $file) {
    echo $file->getFilename() . PHP_EOL;
}

当然,如果不需要在多个地方执行此操作,那么 zombat 给出的普通 DirectoryIterator/condition 组合非常合适。

于 2010-01-22T13:56:16.940 回答