Php 使用glob模式的帮助

Php 使用glob模式的帮助,php,glob,Php,Glob,如果有人能给我一个用于glob的regexp模式,以获取以下文件名,那将非常好: 1.jpg // this file 1_thumb.jpg 2.png // this file 2_thumb.png etc... 返回不带“_thumb”的文件。我有这样的模式: $numericalFiles = glob("$this->path/*_thumb.*"); 这给了我“拇指”的全部含义。全局模式和正则表达式是不同的。但是PHP的glob实现没有实现仅匹配这些文件所需的模式否定。您

如果有人能给我一个用于glob的regexp模式,以获取以下文件名,那将非常好:

1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回不带“_thumb”的文件。我有这样的模式:

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

这给了我“拇指”的全部含义。

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

glob()
在处理文件匹配复杂需求的情况时不是最好的,您已经清楚地注意到了这一点。我建议使用PHP的SPL库并利用该类

foreach (glob('[0-9]*') as $filename) {
    if (strpos("$filename","_thumb") === FALSE){
        echo "$filename \n";
    }
}
您可以在迭代过程中干净地修改您的条件(此外,如果您需要的话,可以很容易地修改迭代器)。

除了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组合是非常合适的。

但是有可能
glob()
可以由libc处理,因此从它开始就意味着您将在更慢的PHP中迭代更少的结果。
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;
}