Newsgroup: it.comp.www.php
Titolo: Scrivi la parola che vuoi cercare...

Salve, avrei da proporvi un problema tanto banale quanto fastidioso, allora,
uso php3 e ho scritto una funzione che ricerca una stringa in un insieme di
file , come parametri gli vengono passati una stringa e un array contente tutte
le dirs in cui si vuole cercare questa stringa(ovviamente nei file che si
trovano in queste dirs)dopo vari tentativi mi è uscita questa:
--inizio--
function FindString($Fstring, $Dirs)
{
 for( $i=0; $i < count($Dirs); $i++)
 {
  $fd = opendir($Dirs[$i]);
  if(!$fd)
   continue;
  while($file = readdir($fd))
  {
   if ($file == "." || $file == ".." )
    continue;		
   $file = $Dirs[$i] . "/" . $file;	 	
   $flag = 0;	
	$fp = fopen($file, 'r');	
	if(!$fp)
     continue;
    while(!feof($fp))
    {
     $buffer = fgets($fp, 4096);
     $buffer = trim($buffer);
     $buffer = strip_tags($buffer);
     $buffer = strtolower($buffer);
     $buffer = ereg_replace(",|\.|:|;|\?|\!|'", " ", $buffer);
     $a_buffer = split(" ", $buffer);
     for($k=0; $k < count($a_buffer); $k++ )
	  if(!strcmp($Fstring, $a_buffer[$k]))
	   $flag++;
	}
   if($flag)
    $Ret[$file] = $flag;
  }
 }
 if(!$Ret)
  return 0;	
 arsort($Ret);
 return $Ret;
}
--fine--
A dirla breve avviene questo:
1. Una dopo l'altra vengono aperte tutte le dir presenti nell'array passato
come parametro
2. Per ogni dir si leggono i suoi file escludendo "." e ".."
3. Ogni file è letto stringa x stringa(di 4096 chars), ognuna di queste viene
trimmata e strippata, ridotta a chars minuscoli e le vengono tolti alcuni
caratteri di troppo, poi la splitto parola per parola e ciascuna di queste è
confrontata con la stringa di ricerca.
4.Viene creato un hash che ha come chiavi i nomi dei file e come valori il
numero di corrispondenze trovate della stringa di ricerca, questo hash è poi
sortato e ritornato.
Fin qui tutto bene, la function funzia ma è presente un'errore madornale, se
nelle dirs di ricerca sono presenti delle sottodirs la function le legge come
dei file, dando quindi errori, o cercato di ovviare al problema modificando
la funzione così :
--inizio--
function FindString($Fstring, $Dirs)
{
 for( $i=0; $i < count($Dirs); $i++)
 {
  $fd = opendir($Dirs[$i]);
  if(!$fd)
   continue;
  while($filed == readdir($fd))                  //nuovo
   if(is_dir($filed))                                   //nuovo
    $DirArray[] = $filed;                            //nuovo
  if(isset($DirArray))                                 //nuovo
   $Ret = FindString($Fstring, $DirArray);     //nuovo
  rewinddir($fd);	                                      //nuovo
  while($file = readdir($fd))
  {
   if ($file == "." || $file == ".." )
    continue;		
   $file = $Dirs[$i] . "/" . $file;	 	
   $flag = 0;	
	$fp = fopen($file, 'r');	
	if(!$fp)
     continue;
    while(!feof($fp))
    {
     $buffer = fgets($fp, 4096);
     $buffer = trim($buffer);
      $buffer = strip_tags($buffer);
	 $buffer = strtolower($buffer);
	 $buffer = ereg_replace(",|\.|:|;|\?|\!|'", " ", $buffer);
	 $a_buffer = split(" ", $buffer);
     for($k=0; $k < count($a_buffer); $k++ )
	  if(!strcmp($Fstring, $a_buffer[$k]))
	   $flag++;
	}
   if($flag)
    $Ret[$file] = $flag;
  }
 }
 if(!$Ret)
  return 0;	
 arsort($Ret);
 return $Ret;
}
--fine--
Di nuovo ci sono solo quelle 6 righe all'inizio , in pratica prima di
passare alla vera e propria lettura dei file leggo da ogni dir passata in
parametro quante altre dirs contiene e le metto in un array che passo
ricorsivamente alla stessa funzione, il problema è che tutto si blocca ed io
non riesco a trovare l'errore(rimpiango il caro gdb con il C), spero nella
vostra buona anima(magari se devota al dio Tux) e nella vostra genialità.
Grazie.

 Grazie.
Io semplifichere:
Prova prima di tutto a fare una funzione che legge ricorsivamente le
directory e ti ritorna un array con tutti i file trovati
Poi semplicemente fai le tue ricerche su quelli, c'e' anche la funzione
substr_count per contare le occorrenze, oltre naturalmente alle regex per
ricerche anche complesse.
Nella prima parte ricordati di passarti l' array dei file per riferimento  o
simile.
Nel tuo script invece dei file avresti dovuto tenerti i vari $ret, a meno
che non fai un print al volo del risultato ?
Scusa ma sono quasi le 5, magari domani se ho tempo vedo di provare a
spippolare qualcosa, mi sono sempre piaciute le funzioni ricorsive.
P.S. Magari spiega piu' precisamente il tuo obbiettivo cosi' e' possibile
analizzare una soluzione ottimale.
--
--
Damiano Trisciani - 
dam...@tnx.it
Webmaster & Sysadmin of:
http://www.tnx.it
 - The Network Xperience - Web Design & Programming
http://www.astrofili.org
 - Il portale per l' astronomia in Italia
"folos" <fo...@localhost.localdomain> ha scritto nel messaggio
news:slrn9ol7g...@localhost.localdomain...


analizzare una soluzione ottimale.
esattamente quello scritto, ricercare stringhe in gruppo di file, avendo
le dirs che li contengono.
ciao e grazie.


file , come parametri gli vengono passati una stringa e un array contente tutte
Magari dico una fesseria, ma perche' reinventare la ruota quando si 
puo' usare un programma che gia' fa quello che vuoi?
Non puoi usare grep?
  "grep -dil $stringa $path.'/*.*'"
o qualcosa del genere.
Vedi exec(), passthru(), system(), ecc
-- 
Filippo "Kirone" Zamengo 
Quanto scritto deve ritenersi IMHO e indipendente dal datore di lavoro
e-mail modificata: togliere DESPAM.