Php 使用glob模式的帮助
如果有人能给我一个用于glob的regexp模式,以获取以下文件名,那将非常好:Php 使用glob模式的帮助,php,glob,Php,Glob,如果有人能给我一个用于glob的regexp模式,以获取以下文件名,那将非常好: 1.jpg // this file 1_thumb.jpg 2.png // this file 2_thumb.png etc... 返回不带“_thumb”的文件。我有这样的模式: $numericalFiles = glob("$this->path/*_thumb.*"); 这给了我“拇指”的全部含义。全局模式和正则表达式是不同的。但是PHP的glob实现没有实现仅匹配这些文件所需的模式否定。您
1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...
返回不带“_thumb”的文件。我有这样的模式:
$numericalFiles = glob("$this->path/*_thumb.*");
这给了我“拇指”的全部含义。全局模式和正则表达式是不同的。但是PHP的glob实现没有实现仅匹配这些文件所需的模式否定。您需要使用更大的正向模式,如
[0-9]*.jpg
,然后过滤结果。glob()
在处理文件匹配复杂需求的情况时不是最好的,您已经清楚地注意到了这一点。我建议使用PHP的SPL库并利用该类
foreach (glob('[0-9]*') as $filename) {
if (strpos("$filename","_thumb") === FALSE){
echo "$filename \n";
}
}
您可以在迭代过程中干净地修改您的条件(此外,如果您需要的话,可以很容易地修改迭代器)。除了DirectoryIterator之外,还可以构建自己的专用过滤器类,以简化操作(请参见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组合是非常合适的。但是有可能glob()
可以由libc处理,因此从它开始就意味着您将在更慢的PHP中迭代更少的结果。
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;
}