Does glob() have negation?

笑着哭i 提交于 2019-12-17 19:34:16

问题


I know I can do this...

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

...to get all files ending in .zip, but is there a way to return all files that are not ZIPs?

Or should I just iterate through and filter off ones with that extension?


回答1:


I don't think glob can do a "not-wildcard"...

I see at least two other solutions :

  • use a combinaison of opendir / readdir / closedir
  • Or use some SPL Iterator ; To be more specific, I'm thinking about DirectoryIterator ; and maybe you can combine it with some FilterIterator ?



回答2:


You could always try something like this:

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

Although, using one of the other methods Pascal mentioned might be more efficient.




回答3:


A quick way would be to glob() for everything and use preg_grep() to filter out the files that you do not want.

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

Also see Glob Patterns for File Matching in PHP




回答4:


This pattern will work:

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

which finds everything in /dir/somewhere/ ending in a dot followed by either

  • one character (?)
  • or two characters (??)
  • or anything not starting with the consecutive letter z,i,p ([!z][!i][!p]*)



回答5:


$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);
    }
}

NB: "." and ".." not taken care of. Left for OP to complete



来源:https://stackoverflow.com/questions/1877524/does-glob-have-negation

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!