這將是很好,如果有人可以給我一個水珠正規表達式模式用於獲取以下文件名:幫助,glob模式
1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回文件,而無需「_thumb」。我有這樣的模式:
$numericalFiles = glob("$this->path/*_thumb.*");
並給我所有的「_thumb」。
這將是很好,如果有人可以給我一個水珠正規表達式模式用於獲取以下文件名:幫助,glob模式
1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回文件,而無需「_thumb」。我有這樣的模式:
$numericalFiles = glob("$this->path/*_thumb.*");
並給我所有的「_thumb」。
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修改迭代器)中乾淨利落地修改你的標準。
全局模式和正則表達式是不同的。但是PHP的glob實現並沒有實現匹配這些文件所需的模式否定。您需要使用較大的正模式,例如[0-9]*.jpg
,然後過濾結果。
foreach (glob('[0-9]*') as $filename) {
if (strpos("$filename","_thumb") === FALSE){
echo "$filename \n";
}
}
繼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 /條件組合是完全合適的。
但是* *有可能'glob()'可以被libc處理,所以從這開始就意味着你將在更慢的PHP中迭代更少的結果。 – 2010-01-18 07:36:21