如果有人能给我一个 glob 的正则表达式模式来获取以下文件名,那就太好了:
1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回没有“_thumb”的文件。我有这个模式:
$numericalFiles = glob("$this->path/*_thumb.*");
这给了我所有的“_thumb”。
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();
}
}
您可以在迭代期间干净地修改您的标准(此外,如果您需要递归目录迭代,也很容易修改迭代器)。
Glob 模式和正则表达式是不同的。但是 PHP 的 glob 实现并没有实现匹配这些文件所需的模式否定。您将需要使用更大的正面模式,例如[0-9]*.jpg
然后过滤结果。
foreach (glob('[0-9]*') as $filename) {
if (strpos("$filename","_thumb") === FALSE){
echo "$filename \n";
}
}
除了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 组合非常合适。