13

我知道我可以做到这一点...

glob('/dir/somewhere/*.zip');

...获取所有以 结尾的文件.zip,但是有没有办法返回所有不是ZIP 的文件?

或者我应该只遍历并过滤掉具有该扩展名的那些?

4

5 回答 5

27

你总是可以尝试这样的事情:

$all = glob('/dir/somewhere/*.*');
$zip = glob('/dir/somewhere/*.zip');
$remaining = array_diff($all, $zip);

虽然,使用 Pascal 提到的其他方法之一可能更有效。

于 2009-12-09T23:09:19.190 回答
17

一种快速的方法是glob()用于所有内容并用于preg_grep()过滤掉您不想要的文件。

preg_grep('#\.zip$#', glob('/dir/somewhere/*'), PREG_GREP_INVERT)

另请参阅PHP 中文件匹配的 Glob 模式

于 2012-04-06T19:16:47.907 回答
9

这种模式将起作用:

glob('/dir/somewhere/*.{?,??,[!z][!i][!p]*}', GLOB_BRACE);

它会在 /dir/somewhere/ 中找到以点结尾的所有内容,然后是

  • 一个字符 ( ?)
  • 或两个字符 ( ??)
  • 或任何不以连续字母 z,i,p ( [!z][!i][!p]*)开头的内容
于 2012-11-07T15:50:15.237 回答
8

我不认为 glob 可以做一个“非通配符”......

我看到至少两个其他解决方案:

于 2009-12-09T23:04:49.820 回答
0
$dir = "/path";
if (is_dir($dir)) {
    if ($d = opendir($dir)) {
           while (($file = readdir($d)) !== false) {
                if ( substr($file, -3, 3) != "zip" ){
                    echo "filename: $file \n";
                }
           }
        closedir($d);
    }
}

注意:“。” 和“..”没有照顾。留给 OP 完成

于 2009-12-10T04:48:06.883 回答