帮助glob模式

时间:2010-01-18 06:50:01

标签: php glob

如果有人能给我一个用于获取低于文件名的glob的正则表达式模式,那将是很好的:

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

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

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

并且给了我所有的“_thumb。”

4 个答案:

答案 0 :(得分: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();
    }
}

您可以在迭代期间干净地修改您的条件(如果您需要recursive directory iteration,也很容易修改迭代器。)

答案 1 :(得分:3)

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

答案 2 :(得分:3)

foreach (glob('[0-9]*') as $filename) {
    if (strpos("$filename","_thumb") === FALSE){
        echo "$filename \n";
    }
}

答案 3 :(得分:1)

除了DirectoryIterator的zombat's use之外,构建自己的专用过滤器类以使生活更轻松(查看与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组合非常合适。