glob函数中的RegEx模式

时间:2014-05-09 13:39:09

标签: php regex filenames glob

我在函数中记录了一个文件名。我想从其他目录返回所有类似于此文件的文件(通过文件名)。我写了这个:

    $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 个答案:

答案 0 :(得分:14)

glob()实际上是一个准正则表达式引擎。通过对文档的评论,它允许?*

  

glob使用两个特殊符号,这些符号的作用类似于元字符和量词之间的混合。这两个字符是*和?

     

?匹配除

之外的任何字符中的1个      

*匹配除了/

之外的任何字符的0或更多      

如果有帮助,可以将*视为。*和?的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/*);中,*/不匹配,因此这不会获得子目录中的任何文件。它只会遍历该路径中的每个文件和目录;如果你想更深入,你将不得不做一个递归函数。

注意我清理了您的expression

_\d+x\d+_thb\.

\d大致等于[0-9](它还包括阿拉伯数字字符等),您无需转义x(所以没有\x),而您想逃离期间(\.)。