2009-12-09 9 views
11

Ich weiß, dass ich das tun kann ...Hat glob() Negation?

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

... alle Dateien in .zip Endung zu bekommen, aber ist es eine Möglichkeit, alle Dateien zurück, die nicht ZIPs ist?

Oder sollte ich nur diejenigen mit dieser Erweiterung durchlaufen und filtern?

+0

** negative Wildcardoder zwei Zeichen (??)

  • oder irgendetwas nicht mit der aufeinanderfolgenden Buchstaben z, i, p ([!z][!i][!p]*) ausgehend ** –

  • Antwort

    8

    Ich glaube nicht glob eine "nicht-Wildcard" tun können ...

    ich mindestens zwei weitere Lösungen finden Sie unter:

    18

    Man könnte immer so etwas wie dies versuchen:

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

    Obwohl einer der anderen Methoden Pascal erwähnt könnte effizienter sein.

    +0

    Dieses Verfahren ist elegant. +1 –

    +0

    Ich habe den Verdacht, dass die Performance-Overhead auf großen Verzeichnissen/Arrays etwas erheblich sein könnte, aber es ist definitiv das eleganteste Beispiel. +1 – Unsigned

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

    Hinweis: "." und ".." nicht beachtet. Links für OP zu vervollständigen

    15

    Ein schneller Weg wäre glob() für alles und verwenden Sie preg_grep(), um die Dateien herauszufiltern, die Sie nicht wollen.

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

    Siehe auch Glob Patterns for File Matching in PHP

    +0

    Ahh Snap, das ist eine * super alte * Frage. * \ * schüttelt die Faust bei Alex \ ** – salathe

    +0

    sehr schöne Art es zu tun – goat

    +0

    @salathe Warum schütteln Sie Ihre Faust auf mich? – alex

    9

    wird dieses Muster arbeiten:

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

    , die alles in/dir findet/irgendwo/in einem Punkt entweder durch

    • ein Zeichen gefolgt endet (?)
    +0

    Sorry @Gordon, -1. Dies findet alles in '/ dir/somewhere /' und endet in einem Punkt, gefolgt von drei Zeichen (ohne 'zip'). Es wird ** nicht ** mit längeren oder kürzeren Dateiendungen übereinstimmen. – salathe

    +0

    @salathe hmm. Vielen Dank. Die Beschreibung wurde aktualisiert. Eigentlich habe ich versucht, es mit '{! Zip}' arbeiten zu lassen, aber anscheinend unterstützt PHP das nicht? Könnte das Obige mit Zahnspangen gemischt werden? – Gordon

    +2

    * Könnte das Obige mit Zahnspangen gemischt werden? * Ja, könnte es. Zum Beispiel, '*. {?, ??, [! Z] [! I] [! P] *}' – salathe