Было бы неплохо, если бы кто-то мог дать мне шаблон регулярного выражения для glob для получения ниже имен файлов:
1.jpg // this file 1_thumb.jpg 2.png // this file 2_thumb.png etc...
возвращая файлы без «_thumb». У меня есть эта схема:
$numericalFiles = glob("$this->path/*_thumb.*");
и это даст мне всех "_thumb".
glob()
не самый большой при обработке ситуаций, когда у вас есть сложные требования к сопоставлению файлов, как вы ясно заметили. Я бы рекомендовал использовать библиотеку SPL PHP и воспользоваться классом DirectoryIterator .
$iterator = new DirectoryIterator("/dir/path"); foreach ($iterator as $file) { if ($file->isFile() && preg_match("/^[0-9]+\./i",$file->getFilename())) { echo $file->getFilename(); } }
Вы можете корректно изменять свои критерии во время итерации (также легко изменить итератор, если вам нужна рекурсивная итерация каталогов ).
Шаблоны Глоба и регулярные выражения различны. Но реализация glob PHP не реализует отрицание шаблона, необходимое для сопоставления именно этих файлов. Вам нужно будет использовать более крупный позитивный шаблон, такой как [0-9]*.jpg
а затем фильтровать результаты позже.
foreach (glob('[0-9]*') as $filename) { if (strpos("$filename","_thumb") === FALSE){ echo "$filename \n"; } }
В дополнение к использованию zombat 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; }
Конечно, если нет необходимости делать это в нескольких местах, то вполне подходящим является обычная комбинация каталогов / условий, заданная зомбатом.