如果有人能给我一个用于获取低于文件名的glob的正则表达式模式,那将是很好的:
1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回没有“_thumb”的文件。我有这种模式:
$numericalFiles = glob("$this->path/*_thumb.*");
并且给了我所有的“_thumb。”
答案 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组合非常合适。