Сопоставление шаблона php glob для произвольного количества цифр

Можно ли сопоставить произвольное количество цифр с функцией php glob? Я пытаюсь сопоставить имена файлов для миниатюр изображений, которые заканчиваются размерами от двух до четырех цифр.

Я знаю, что могу указать диапазон цифр, но это соответствует только одному символу:

glob("thumbname-[0-9]-[0-9].jpg")

Это будет соответствовать thumbname-1-1.jpg, но не thumbname-10-10.jpg и т. д.


person baseten    schedule 24.01.2013    source источник


Ответы (3)


Попробуйте использовать: glob("thumbname-[0-9]*-[0-9]*.jpg")

Я сделал тест, и он работает для меня.

person m4t1t0    schedule 24.01.2013
comment
Этого может быть достаточно, хотя оно будет соответствовать thumbname-1a-1b.jpg. - person baseten; 24.01.2013
comment
Кажется, это лучшее, чего может достичь glob, но в конце концов это было слишком двусмысленно, так как оно также соответствовало бы thumbname-2-1-1.jpg. В итоге я использовал RegexIterator с регулярным выражением, которое я разместил в комментариях. - person baseten; 25.01.2013
comment
будет ли это работать так glob(thumbname-[0-9]+-[0-9]+.jpg)? Если бы это были только цифры... - person Tebe; 10.03.2014
comment
Это не правильно. * соответствует всему, а не только любому предыдущему выражению. [0-9]* соответствует числу, а затем чему-то еще. * эквивалентно .* в полном регулярном выражении, а не * - person mikepa88; 28.11.2016
comment
Если вы хотите сопоставить только thumbname-10-10.jpg и не thumbname-1a-1b.jpg, вы хотите использовать glob("thumbname-*[0-9]-*[0-9].jpg").....однако, это также будет соответствовать thumbname-a1-b1.jpg, так что это не идеально. - person Matt Popovich; 28.10.2020

Альтернатива glob(), использующая recursiveDirectoryIterator с регулярным выражением

$Directory = new RecursiveDirectoryIterator('path/to/project/');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator,
    '/^thumbname-[0-9]*-[0-9]*\.jpg$/i', 
    RecursiveRegexIterator::GET_MATCH
);
person Mark Baker    schedule 24.01.2013
comment
Спасибо, на самом деле я могу использовать этот метод, поскольку регулярное выражение даст мне гораздо больше контроля над шаблоном. Я принял глобальный ответ, хотя это был исходный вопрос. - person baseten; 24.01.2013
comment
В конце концов я выбрал этот метод, так как шаблон глобуса был слишком неоднозначным. Я обнаружил, что это будет соответствовать thumbname-2-1-1.jpg, который удалил дополнительные файлы. В итоге я использовал регулярное выражение: '/^thumbname-[0-9]+-[0-9]+(@2x)?\.(jpg|jpeg|gif|png)$/i', так как это дало мне настоящие произвольные цифры и необязательный суффикс сетчатки - person baseten; 25.01.2013
comment
Только что заметил, что это, кажется, терпит неудачу с привязкой к началу строки ^, кажется, что RegexIterator проверяет полный путь к файлу, а не только имя файла? - person baseten; 25.01.2013
comment
Это должно быть достаточно легко изменить, просто удалив начальную привязку... конечная привязка остается, а первая часть регулярного выражения представляет собой фиксированную миниатюру, она все равно должна работать правильно. - person Mark Baker; 25.01.2013

Вы можете разделить числа на разные массивы глобусов и объединить их.

Например, сначала вы берете все изображения от 0 до 9 в один массив:

$g1 =  glob('thumbname-[0-9].jpg');

После этого вы создаете еще один массив, содержащий числа от 10 до 99:

$g2 =  glob('thumbname-[0-9][0-9].jpg');

Теперь вы объединяете эти 2 массива в один и получаете все от 0 до 99:

$gResult = array_merge($g1, $g2);

Вы можете расширить его настолько, насколько хотите, просто добавьте [0-9]

person utdev    schedule 30.11.2016