Использование glob() для получения имен файлов без "v[0-9]"

Я умею пользоваться glob() чтобы получить все файлы изображений в каталоге, но я хочу сэкономить время поиска и выбрать только те, которые мне нужны в первую очередь.

Я создаю веб-сайт автосалона, и есть каталог, где хранятся все фотографии автомобилей. Фотографии, связанные с транспортным средством для продажи, начинаются с буквы "v", затем с идентификатором базы данных, а затем с точкой перед моделью транспортного средства.

Вот примерный список файлов в каталоге:

v313.2014.toyota.camry.0.jpg
v313.2014.toyota.camry.1.jpg
fordfusion.jpg
fordfusion2.jpg
v87.2015.honda.civic.0.jpg
v87.2015.honda.civic.1.jpg
2014.ford.escape.0.jpg
2014.ford.escape.1.jpg

Только из этих файлов fordfusion.jpg, fordfusion2.jpg, 2014.ford.escape.0.jpg, 2014.ford.escape.1.jpg должен быть возвращен glob(),

Я надеюсь, что это возможно без извлечения всех файлов изображений и последующего просмотра массива с помощью регулярных выражений, потому что 90% извлекаемых изображений не понадобятся.

2 ответа

Я надеюсь, что это возможно без извлечения всех файлов изображений и последующего просмотра массива с помощью регулярных выражений, потому что 90% извлекаемых изображений не понадобятся.

Если в каталоге нет слишком большого количества файлов, об этом не стоит беспокоиться. glob() внутренне приходится перебирать все файлы в папке, чтобы в любом случае сверять их имена с шаблоном; делать это в коде PHP с регулярным выражением будет одинаково хорошо.

Если в каталоге действительно очень много файлов... не делайте этого. Большие каталоги в целом работают очень плохо, и многие файловые системы имеют ограничения на количество файлов в папке. (Например, файловая система ext3, распространенная в старых системах Linux, имеет ограничение в 32 768 файлов в одном каталоге.) Разделите их на несколько каталогов.

Чтобы ответить на вопрос напрямую, однако, нет никакого способа сделать это с glob() шаблон. Можно сопоставить все файлы, имена которых начинаются таким образом, но нет способа инвертировать совпадение. (Вы можете проверить [^v]* а также v[^0-9]* как два отдельных шаблона, но нет возможности объединить их в один шаблон.)

Если вы уверены, что файлы, которые вы не хотите извлекать, начинаются с буквы v или начинается с v сопровождаемый любым digit Вы можете попробовать использовать следующее регулярное выражение

^[^v]+$|^v[^\d].+

проверить демо

Другие вопросы по тегам