by Carlesso Cristian
INTRO:la mia prima pillola in php.
Studio questo linguaggio da meno di un mese e
dopo aver letto l' articolo sui template e i vari 3d sono rimasto
affascinato da come utilizzando una soluzione relativamente semplice
sia possibile estrarre il codice php da una pagina html.
l' articolo e' il seguente:
Utilizziamo i template integrati con Php
con relativo 3d:http://forum.html.it/forum/showthrea...hreadid=333902
inoltre interessante anche il 3d template dinamici(?)
I 2 metodi proposti erano quelli del metodo eval();
e del metodo eregi_replace();
ma mentre il primo e' troppo lento il secondo richiede che per ogni
variabile introdotta nell html deve esserci un eregi_Replace.
ho allora cominciato a pensare ad un metodo unico
per poter con una sola istruzione cambiare tutte le
variabili contenute nel Template.
il metodo che ho studiato fonde i due metodi proposti
nel senso che ho automatizzato la funzione in modo che
non occorra eseguire un istruzione per ogni variabile,
usando un eval particolare, quello delle espressioni
regolari in stile perl, in particolare ho usato la funzione
preg_replace(); ottenendo cosi' i risultati voluti..
inoltre ho scoperto che e' addirittura piu' veloce della eregi_replace
poiche' lo stile POSIX e' piu' lento dello stile PERL.
cominciamo con analizzare un template che chiamero a.html
codice:
<html><head><title>template</title>
</head>
<body>
Sicuramente i
ameranno la
</body>
</html>
ed ora vediamo come ho proceduto per effettuare la magia:
Codice PHP:
<?php
$name="fagiani";
$pippo="pillola";
$pluto=implode("",file("a.html"));
$ho=preg_replace('/()/e','$$2',$pluto);
echo $ho;
?>
ora, indipendentemente dal codice scritto male (programmo in
php da pochissimo) si puo' vedere che soltanto cambiando il pattern
si puo' fare un po' di tutto ..
da cambiare il simbolo di $ con un qualsiasi altro simbolo
se poi i template vengono creati dinamicamente si possono creare
pagine html diverse in base alle preferenze dell' utente
complicando un po la sostituzione si puo arrivare fino
alla creazione di custom tag(ci sto lavorando) e altro ancora..
analizziamo un attimo il codice:
tutto e' svolto dall' istruzione preg_replace();
ma andiamo per ordine:
codice:
$ho= la stringa finale verra messa in $ho
preg_replace('/ qui inizia L espressione da trovare
(<!--) cerca un tag di inizio commento
/$ cerca il segno del $
(\w+) cerca o un _(underscore) o un carattere alfanumerico
praticamente un carattere con cui puo essere scritto
una variabile
(-->) cerca il tag di chiusura commento
/e' usa eval se esiste codice php.
,'$$2' sostituisce (\w+) con $(\w+) ovvero con il valore.
,$pluto); il file di template.
ora creiamo una funzione che passato solo il filename del template faccia tutto
Codice PHP:
function Carlesso_Replace($filename){
return preg_replace('/()/e','$GLOBALS[$2]',implode("",file($filename)));
}
naturalmente si possono aggiungere tutti i controlli del caso.
Ps. passo anche la pagina che calcola il tempo d'esecuzione.
io su un 486 sx 12 Mb di ram 33mhz ho avuto i seguenti tempi medi:
mio algoritmo:
0.96687343478203
eregi_replace:
1.3514632582664
Codice PHP:
<?php
function getMicroTime(){
list($usec,$sec)=explode(' ',microTime());
return ((float)$usec + (float)$sec);
}
/* Numero ripetizioni peruna media "probabile" +1 */
$iter=101;
/* Numero di esecuzione del codice per ogni ripetizione */
$max= 100;
set_time_limit(0);
for($i=0;$i<$iter;$i++){
ob_start();
$time_start=getMicroTime();
for($a=0;$a<$max;$a++){
/* Codice da eseguire*/
}
$total= getmicrotime() - $time_start ;
ob_end_clean;
print($i."\n\t --Total Time :\n".$total." seconds \n");
/*Scartiamo la prima ripetizione poiche' fuorviante*/
if($i>0)
$glob +=$total;
}
print("\nMedia: \n\t". $glob/($iter-1) ." --per \n ".$max." iterazioni\n\n");
?>
ho trovato quest' ultima funzione su linux e c numero 31.
...
la suppostina e' finita, andate in pace, naturalmente
per eventuali correzioni chiarimenti, eccetera postate pure..
se migliorate l' algoritmo sono il primo ad esservene riconoscente.