2010-01-18 79 views
5

这将是很好,如果有人可以给我一个水珠正规表达式模式用于获取以下文件名:帮助,glob模式

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

返回文件,而无需“_thumb”。我有这样的模式:

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

并给我所有的“_thumb”。

回答

6

​​3210是不是在处理,你必须对文件匹配复杂的要求,因为你已经清楚地注意到的情况是最大的。我建议使用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

但是* *有可能'glob()'可以被libc处理,所以从这开始就意味着你将在更慢的PHP中迭代更少的结果。 – 2010-01-18 07:36:21

3

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

3
foreach (glob('[0-9]*') as $filename) { 
    if (strpos("$filename","_thumb") === FALSE){ 
     echo "$filename \n"; 
    } 
} 
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 /条件组合是完全合适的。