使用fnmatch()匹配多个文件扩展名

时间:2010-12-15 17:22:37

标签: php

在典型的文件匹配代码中:

while (false !== ($file = readdir($handle))) {
    if ($file !== "." && $file !== ".." && fnmatch($mask, $file)) {
        $dirList[] = $file;
    }
}

我试图使用像这样的多文件扩展名模式:

$mask = "*.{jpg,png,gif}";

但它不起作用。没有文件匹配。这很奇怪,因为相同的模式在终端中工作得很好。它也适用于glob(),返回我想要的文件。我知道其余代码没有任何问题,因为使用“* .jpg”作为掩码也适用于fnmatch。是不是fnmatch应该支持shell中可用的相同模式?

2 个答案:

答案 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兼容性的讨论(在它的定义下),你会发现函数的正则表达式实现不考虑大括号表示法。