Шаблон регулярных выражений в функции 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), и вы хотите избежать периода (\.).