2009-12-09 3 views
11

Je sais que je peux le faire ...Est-ce que glob() a la négation?

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

... pour obtenir tous les fichiers se terminant par .zip, mais est-il un moyen de retourner tous les fichiers qui ne sont pas ZIPs?

Ou devrais-je juste parcourir et filtrer ceux avec cette extension?

+0

** générique négatif ** –

Répondre

8

Je ne pense pas que glob peut faire ...

"non joker" Je vois au moins deux autres solutions:

18

Vous pouvez toujours essayer quelque chose comme ceci:

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

Bien que, en utilisant l'une des autres méthodes Pascal mentionnées pourraient être plus efficaces.

+0

Cette méthode est plus élégante. +1 –

+0

Je soupçonne que la surcharge de performance pourrait être assez importante sur les grands répertoires/tableaux, cependant, c'est certainement l'exemple le plus élégant. +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); 
    } 
} 

NB: "." et ".." ne sont pas pris en charge. Gauche pour OP à compléter

15

Un moyen rapide serait à glob() pour tout et utiliser preg_grep() pour filtrer les fichiers que vous ne voulez pas.

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

Voir aussi Glob Patterns for File Matching in PHP

+0

Ahh snap, c'est une question * super ancienne *. * \ * serre le poing à alex \ ** – salathe

+0

très belle façon de le faire – goat

+0

@salathe Pourquoi es-tu en train de me serrer le poing? – alex

9

Ce modèle fonctionne:

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

qui trouve tout dans/dir/quelque part/se terminant par un point suivi par l'une

  • un caractère (?)
  • ou deux caractères (??)
  • ou quoi que ce soit pas en commençant par la lettre z consécutive, i, p ([!z][!i][!p]*)
+0

Désolé @Gordon, -1. Cela trouve tout dans '/ dir/somewhere /' se terminant par un point suivi de trois caractères (non compris 'zip'). Il ne ** correspondra pas ** aux extensions de fichier plus longues ou plus courtes. – salathe

+0

@salathe hmm. Merci. Mise à jour de la description En fait, j'essayais de le faire fonctionner avec '{! Zip}' mais apparemment PHP ne le supporte pas? Est-ce que ce qui précède peut être mélangé avec des accolades? – Gordon

+2

* Est-ce que ce qui précède peut être mélangé avec des accolades? * Oui, il pourrait. Par exemple, '*. {?, ??, [! Z] [! I] [! P] *}' – salathe