2010-01-18 124 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 /條件組合是完全合適的。