2011-01-17 9 views
20

Sto cercando di elencare i file in una directory (ricorsivo o non) con PHP dove nomefile corrisponde a un determinato modello. Non sono mai stato troppo bravo con regex quindi qualsiasi aiuto che potresti offrire sarebbe fantastico. Potrei cercare un controllo letterale sui nomi di file restituiti, ma penso che non è una grande idea :)trovare tutti i file nella directory con lo spago o un pattern in nome del file con PHP

Update + Soluzione Finale: 1/18/2011 @ 20:06

Ho trovato un altro modo per fare ciò che stavo cercando, una volta ho capito un po 'di regex. Certo, ero del tutto frustrato riguardo a dove mi trovavo con la regex, ora ne prendo un po 'grazie a un amico che mi trascina in disparte per spiegare un po' di ciò in termini più semplici di quelli che trovavo nelle guide online.

Questa soluzione controlla sostanzialmente un'immagine specifica (s) con un prefisso principale di "prefisso" o "prefixtwo", mentre verifica anche che si tratti di un'immagine di un certo tipo (jpg, jpeg, png) e corrisponde a qualsiasi dei seguenti formati.

seconda della lumaca è stato superato da Wordpress (dove stavo usando questo), sarebbe partita con questa espressione regolare. Ecco una lista di esempio:

prefixone.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.002.jpeg 
prefixtwo.123-abc._tag2._tag1.003.jpg 
prefixone.123-abc._tag2.004.jpeg 
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg 
prefixtwo.123-abc._tag1.001.jpg 
prefixone.345-xyz._tag1.001.png 
prefixtwo.456-rst._tag1.001.png 

Tutti questi file che possono essere stati potenzialmente restituiti nel file sfogliare dalla nostra funzione() opendir, uno di questi avrebbe potuto essere un match se lo slug abbinato. Indipendentemente dall'ordinamento delle informazioni di codifica nel nome file.

Spero che questo aiuta un altro utente alle prese con espressioni regolari. È difficile prendersela con le mani, ma una volta comprese alcune cose fondamentali, il resto inizia a prendere rapidamente il posto giusto per iniziare a costruire il tuo.

Codice:

<?php 
// create an array to hold directory list 
$results = array(); 

// create a handler for the directory 
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/'; 
$handler = opendir($directory); 

// open directory and walk through the filenames 
while ($file = readdir($handler)) { 

    // if file isn't this directory or its parent, add it to the results 
    if ($file != "." && $file != "..") { 

     // check with regex that the file format is what we're expecting and not something else 
     if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) { 

      // add to our file array for later use 
      $results[] = $file; 
     } 
    } 
} 
?> 

non ho effettivamente bisogno ricorsiva per questo, ma ci sono davvero un sacco di esempi ricorsive online e che era veramente l'ultima delle mie preoccupazioni. L'isolamento del contenuto in base al modello era il fulcro di questa attività, quindi il codice precedente era sufficiente.

Nota a margine:

a quelli che ha sottolineato i "commenti accettati" di ieri, non avevo idea che mi mancava e mi scuso. Stavo passando una brutta giornata. Scusate se mi è sembrato di scattare qualcuno a proposito dei commenti. Questa è una grande comunità e sono felice di ridare dove posso, anche.

+0

ho risposto un po ', ma si dice anche 0 di 6 domande ammissibili sono state esaudite. Non vedo nemmeno dove quei 6 settori in cui mi aspetto di rispondere. –

+1

Quando vedo qualcosa su cui penso di poter contribuire, cerco di rispondere o di ricercare il problema per la persona. –

+0

Sì, lo vedo ora. Mi dispiace ragazzi. –

risposta

15

Utilizzare glob to find pathnames matching a pattern o un GlobIterator.

se avete bisogno che per essere ricorsiva use a RegexIterator and a RecursiveDirectoryIterator.

Marcatura questo CW perché la domanda è un duplicato sicuro e si può facilmente trovare esempi per tutto quanto sopra quando si utilizza la funzione di ricerca. Per favore fallo.

+3

Non stavo cercando "RegexIterator" perché non mi era passato per la testa. Non c'è bisogno di chiamarmi per non cercare. Questa è la prima cosa che faccio prima di prendere tempo per scrivere qualcosa. La ricerca è più veloce. –

+2

Apprezzo che tu lo abbia indicato, comunque. Grande aiuto e grazie :) –

Problemi correlati