2009-12-09 13 views
11

So che posso fare questo ...Il glob() ha la negazione?

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

... per ottenere tutti i file che terminano in .zip, ma c'è un modo per restituire tutti i file che non sono ZIP?

Oppure devo solo scorrere e filtrare quelli con quell'estensione?

+0

** ** jolly negativo –

risposta

8

Non credo glob può fare un "non-jolly" ...

vedo almeno altre due soluzioni:

18

Si può sempre provare qualcosa di simile:

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

Anche se, utilizzando uno degli altri metodi Pascal accennato potrebbe essere più efficiente.

+0

Questo metodo è più elegante. +1 –

+0

Ho il sospetto che il sovraccarico delle prestazioni potrebbe essere piuttosto consistente su grandi directory/array, tuttavia, è sicuramente l'esempio più elegante. +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: "." e ".." non curato. Sinistra per OP per completare

15

Un modo rapido sarebbe quello di glob() per tutto e utilizzare preg_grep() per filtrare i file che non si desidera.

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

vedere anche Glob Patterns for File Matching in PHP

+0

Ah, è una domanda * super vecchia *. * \ * scuote il pugno ad alex \ ** – salathe

+0

modo molto bello per farlo – goat

+0

@salathe Perché mi stai stringendo il pugno? – alex

9

Questo modello funziona:

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

che trova tutto in/dir/da qualche parte/che termina in un punto seguito da

  • un carattere (?)
  • o due caratteri (??)
  • o tutto quanto non inizia con la lettera z consecutivo, i, p ([!z][!i][!p]*)
+0

Mi dispiace @Gordon, -1. Questo trova tutto in '/ dir/somewhere /' terminando con un punto seguito da tre caratteri (non incluso 'zip'). ** non ** corrisponderà a estensioni di file più lunghe o più brevi. – salathe

+0

@salathe hmm. Grazie. Aggiornata la descrizione. In realtà, stavo cercando di farlo funzionare con '{! Zip}' ma apparentemente PHP non lo supporta? Potrebbe il sopra essere miscelato con parentesi graffe? – Gordon

+2

* È possibile combinare le parentesi sopra con le parentesi? * Sì, potrebbe. Ad esempio, '*. {?, ??, [! Z] [! I] [! P] *}' – salathe