Шаблон регулярных выражений в функции glob
Я получаю имя файла в функции. Я хочу вернуть все файлы, похожие на этот файл (по имени файла) из другого каталога. Я написал следующее:--3-->
$thumbDir = $this->files_path.'thumbs/';
$toglob = $thumbDir.pathinfo($name, PATHINFO_FILENAME ).'_[0-9]+x[0-9]+_thb.'.pathinfo($name, PATHINFO_EXTENSION);
foreach (glob($toglob) as $key => $value) {
echo $value;
}
но это не работает. Я ищу файлы, имя которых:
oldFileName_[one or more digits]x[one or more digits]_thb.oldFileNameExtension
Я буду очень благодарен, если кто-то поможет мне с этим :)
1 ответов
glob()
действительно квази-регулярное выражение двигателя. Из комментария к документам он позволяет ?
и a *
:
glob использует два специальных символа, которые действуют как своего рода смесь между метасимволом и квантором. Эти два символа * и ?
в ? соответствует 1 любого символа, кроме a/
* соответствует 0 или более любого символа, кроме a/
если это поможет, думаю * как эквивалент pcre .* и ? как эквивалент pcre точки (.)
это означает, что вы не можете использовать ваше выражение _[0-9]+\x[0-9]+_thb.
на glob()
. Вместо этого вы можете посмотреть во всем каталоге и посмотреть, соответствует ли он preg_match()
:
$glob = glob('/path/to/dir/*');
foreach($glob as $file) {
if(preg_match('/_\d+x\d+_thb\./', $file)) {
// Valid match
echo $file;
}
}
понимаю, что в glob(/path/to/dir/*);
на *
не соответствует /
таким образом, это не получит никаких файлов в подкаталогах. Он будет проходить только через каждый файл и каталог в этом пути; если вы хотите идите глубже, вам придется сделать рекурсивную функцию.
обратите внимание, что я очистил ваш выражение:
_\d+x\d+_thb\.
\d
ориентировочно составляет [0-9]
(он также включает арабские символы цифр и т. д.), вам не нужно бежать x
(не \x
), и вы хотите избежать периода (\.
).