我在函数中记录了一个文件名。我想从其他目录返回所有类似于此文件的文件(通过文件名)。我写了这个:
$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
如果有人帮助我,我将非常感激:)
答案 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
),而您想逃离期间(\.
)。