PHP: listato di directory con gli iteratori

PHP: listato di directory con gli iteratori

Creare un listato di directory in PHP è un'operazione che può essere svolta in due modi. Il primo modo è quello di usare un approccio procedurale utilizzando funzioni come glob() o opendir() e creando una funzione ricorsiva che analizzi anche il contenuto delle sottodirectory. L'altro approccio, orientato agli oggetti, consiste nell'utilizzare gli iteratori PHP, in particolar modo gli iteratori di directory. Usando tale approccio la nostra funzione non ha bisogno di essere ricorsiva. In questo esempio vedremo come creare un listato di directory utilizzando gli iteratori per elencare una serie di documenti HTML con relativo URL assoluto e titolo.

La nostra funzione utilizza gli iteratori RecursiveDirectoryIterator e RecursiveIteratorIterator:


function searchDir($dir)
{

  $pages = array();
  
  foreach(new RecursiveIteratorIterator
  (new RecursiveDirectoryIterator($dir)) as $file) {

    if ($file->isFile() && $file->isReadable()) {
  
      if(preg_match('/\.html$/', $file)) {
      
        $uri = substr_replace($file->getPathname(), '', 0, strlen($_SERVER['DOCUMENT_ROOT']));
        $doc = file_get_contents($file->getPathname());
        $titles = preg_match('/<title>.+<\/title>/', $doc, $matches);
        $title = strip_tags($matches[0]);
        
        
        if(preg_match('/index\.html/', $uri)) {
        
          $uri = str_replace('index.html', '', $uri);
        
        }
        
        $fullURL = 'http://' . $_SERVER['HTTP_HOST'] . $uri;
        
        $pages[] = array($fullURL, $title);
      
      }
  
    }


  }
  
  return $pages;
}

Tramite espressioni regolari selezioniamo solo i file il cui nome completo termina con .html. A questo punto eliminiamo dall'URL dei file il path relativo alla document root del nostro server. Quindi utilizziamo la funzione file_get_contents() per ottenere il contenuto dei nostri file da cui poi estrarremo solo il tag title. L'URL ottenuto a questo punto è del tipo /directory-di-partenza/percorso/, quindi abbiamo bisogno di aggiungere il protocollo e l'host a tale URL relativo.

La funzione restituisce un'array che ha in ciascuna voce un sottoarray composto dall'URL completo e dal titolo della pagina. Possiamo usare la nostra funzione in questo modo:


$examples = searchDir($_SERVER['DOCUMENT_ROOT'] . '/esempi');
$html = '<ul>' . "\n";

foreach($examples as $example) {

   $url = $example[0];
   $title = $example[1];
   
   
   $html .= '<li><a href="' . $url . '">' . $title . '</a></li>' . "\n";



}

$html .= '</ul>' . "\n";

echo $html;

Gli iteratori di directory funzionano con percorsi ben precisi, quindi abbiamo dovuto passare alla nostra funzione un riferimento completo che comprende anche la root del nostro server. Potete visionare l'esempio finale in questa pagina.

Torna su