在典型的文件匹配代码中:
while (false !== ($file = readdir($handle))) {
if ($file !== "." && $file !== ".." && fnmatch($mask, $file)) {
$dirList[] = $file;
}
}
我试图使用像这样的多文件扩展名模式:
$mask = "*.{jpg,png,gif}";
但它不起作用。没有文件匹配。这很奇怪,因为相同的模式在终端中工作得很好。它也适用于glob(),返回我想要的文件。我知道其余代码没有任何问题,因为使用“* .jpg”作为掩码也适用于fnmatch。是不是fnmatch应该支持shell中可用的相同模式?
答案 0 :(得分:4)
不支持。
AFAIK *.{ext,alt}
是shell globs的ksh和bash扩展。 fnmatch()
是一个系统函数,但Unix变种的功能各不相同(BSD有,Linux / glibc似乎没有)。存在一个FNM_EXTMATCH
常量,我认为它允许{alt}
起作用。但PHP不支持它/传递它。
但您可以glob()
使用GLOB_BRACE
选项,该选项支持所谓的.{jpeg,png,gif}
匹配。通过这个你可以节省一个readdir()。
答案 1 :(得分:0)
你的大括号表示法是我期望在bash上工作的,但fnmatch()调用对我来说也是失败的(方括号建议也是如此)。如果你在php.net上查看关于这个函数的windows兼容性的讨论(在它的定义下),你会发现函数的正则表达式实现不考虑大括号表示法。