这将是很好,如果有人可以给我一个水珠正规表达式模式用于获取以下文件名:帮助,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