[Lugge] Re: php capriccioso

  • From: "Roberto A. F." <me@xxxxxxxxxxxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Sat, 13 Dec 2003 13:02:44 +0100

On Sat, 13 Dec 2003 11:53:40 +0100
asettico <asettico@xxxxxxxxxxxxxxx> wrote:

> Posto che non conosco PHP, provo a darti qualche risposta:
> 
> Roberto A.Foglietta wrote:
> 
> >     $fp   = fopen($filename, "r");
> >     $cntn = fread($fp, filesize($filename));
> >     fclose($fp);
> >     $cntn = eregi_replace("href=['|\"]([0-9a-z-]+)['|\"]",
> >     "href='index.php?mod=$dir/\\1'", $cntn); echo "$cntn";
> 
> Se ho capito bene, ti carichi _tutto_ il file in /$cntn/.
> Dato che sia /sed/ sia /gensub()/ di awk sostituiscono per default
> solo la _prima_ occorrenza dell'espressione di ricerca, penso che in
> PHP sia lo stesso: probabilmente devi poter specificare lo scope di
> /eregi_replace()/ (tanto per indenterci, tipo in "sed
> 's/expr1/expr2/g'").
> 

 Fin qua ci avevo pensato anche se non ero certo di quale sintassi
usare, perchè oltre sed e awk c'è anche perl e mi pareva di ricordare
che non sono proprio identiche (ma forse mi sbaglio). 

 Però la cosa che mi turba di più è: facendolo riga per riga ed usando
un file in cui c'è solo un link per riga SOLO la prima riga viene
convertita. Questo significa che

 echo "ciao mamma, ciao mamma, ciao mamma" | sed -e "s/mamma/papa/"

 trasforma solo la prima ricorrenza mentre con il g finale anche tutte
le altre ma

 echo "ciao mamma," | sed -e "s/mamma/papa/"
 echo "ciao mamma," | sed -e "s/mamma/papa/"
 echo "ciao mamma"  | sed -e "s/mamma/papa/"

 trasforma tutte le ricorrenze



> Non soo daccordo con questa soluzione, perché caricare _tutto_ un file
> 
> potrebbe essere dispendioso...

 Si è vero infatti non è la soluzione usata ma serviva per mostrare
quello che ti ho detto sopra.



> 
> >     $fp   = fopen($filename, "r");
> >     do {
> >             $line = fgets($fp, 1024);
> >             $line = eregi_replace("href=['|\"]([0-9a-z-]+)['|\"]",
> >             "href='index.php?mod=$dir/\\1'", $line); echo "$line";
> >     } while (!feof($fp));
> >     fclose($fp);
> 
> Pare che qui tu legga il file riga per riga. *Okkio* a _non_ usare il 
> /do-while/, bensì il /while/: se il file fosse vuoto, la prima /fgets/
> cosa restituisce?

 
 Se fosse scritto in C avresti ragione perchè $line sarebbe NULL e
quindi avrei un segmentatio fault mentre per quel che mi risulta il PHP
è NULL-safe ossia qualcosa(NULL) fa ancora NULL od equivalente. Comunque
prima di quel ciclo di while ci sono dei check. Ma ho visto che se
scrivo codice senza cehck sui null funziona lo stesso, solo quando non
esiste proprio il file allora si arrabbia!


> Quindi farei:
> 
>       $fp   = fopen($filename, "r");
>       while (! feof($fp))
>       {
>               $line = fgets($fp, 1024);
>               $line = eregi_replace("href=['|\"]([^'|\"]+)['|\"]", 
> "href='index.php?mod=$dir/\\1'", $line);
>               echo "$line";
>       }
>       fclose($fp);
> 
> Anche in questo caso la /replace()/ potrebbe lavorare solo sulla
> _prima_ occorrenza, ma di _ciascuna_ riga. Ho modificato leggermente
> l'espressione, in modo da renderla un po' più generica.


 Ti ringrazio ho sostituito solo l'espressione ereg e funziona. grazie.
 Dove posso trovare una testo che spieghi le espressioni regolari? Io le
ho viste trattate bene in un manuale di perl ma poi non usando il perl
non mi sono posto il problema di sapere se la sintassi è utilizzata
anche in php, sed e awk


> 
> Di più non posso aggiungere: fai sapere eventuali progressi.

 Ciao,
-- 
   ,__    ,_     ,___   .-------=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-.
   ||_)   ||\    ||_   /        Oh Capitano, Oh mio Capitano       |
   || \   ||¯\   ||¯     linuxgrp: http://www.lugge.net            |
   ¯¯  ¯° ¯¯  ¯° ¯¯  °   homepage: http://roberto.foglietta.name   |
\  Roberto A. Foglietta  reg num : #219348 by the Linux Counter    |
 `---------------------=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-'
========----------

 Prima di scrivere in m-list per favore leggi il regolamento
 http://www.lugge.net/soci/index.php?link=manifesto

 Archivio delle e-mail postate in lista
 //www.freelists.org/archives/lugge/

 Modifica dell'account sulla lista LUGGe
 http://www.lugge.net/soci/index.php?link=manifesto.htm#list


Other related posts: