Intereting Posts

помощь с шаблоном glob

Было бы неплохо, если бы кто-то мог дать мне шаблон регулярного выражения для glob для получения ниже имен файлов:

1.jpg // this file 1_thumb.jpg 2.png // this file 2_thumb.png etc... 

возвращая файлы без «_thumb». У меня есть эта схема:

 $numericalFiles = glob("$this->path/*_thumb.*"); 

и это даст мне всех "_thumb".

Solutions Collecting From Web of "помощь с шаблоном glob"

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; } 

Конечно, если нет необходимости делать это в нескольких местах, то вполне подходящим является обычная комбинация каталогов / условий, заданная зомбатом.