Programmazione Web
Approfondimenti di PHP
Gestione dello stato
Cookie
I cookie possono essere utilizzati per memorizzare informazioni sul client su
richiesta di uno script (max 4KB)
Una volta creato, il cookie è accessibile solo dal server che lo ha richiesto
Possibile configurare il browser per:
• notificare l’utente della ricezione dei cookie
• rifiutare la ricezione di cookie
Possibile analizzare/rimuovere i cookie memorizzati dal browser
Programmazione Web - PHP: approfondimenti
3
Struttura di un cookie
Cookie = (Nome, Valore, Scadenza, …)
Nome = identificatore di accesso al dato memorizzato (il solo obbligatorio)
Valore = informazione memorizzata nel cookie (se è null il cookie è
cancellato dal client)
Scadenza = data in cui il cookie viene “dimenticato” (rimosso) dal browser
secondo il formato timestamp Unix (ottenuto tramite la
funzione time())
Cookie  variabile persistente (tra diverse sessioni) con scadenza stabilita
Programmazione Web - PHP: approfondimenti
4
Uso di un cookie
• Uso della funzione PHP setcookie()  chiamata prima di qualsiasi altra istruzione
• Negli script si accede ai cookie mediante l’array superglobale $_COOKIE, dove sono
registrati solo i cookie già ricevuti dal client
Programmazione Web - PHP: approfondimenti
5
Sessioni
I cookie presentano problemi evidenti
• di sicurezza (sono memorizzati sul client)
• hanno una dimensione limitata (max 4KB)
• possono essere cancellati o disabilitati sul client
Le sessioni permettono la memorizzazione di variabili “persistenti” sul server in un
file di testo
Programmazione Web - PHP: approfondimenti
6
Creazione di una sessione
Una sessione viene invocata tramite la funzione session_start()
Dopo che è stata invocata la funzione session_start(), l'interprete PHP crea un
nuovo file di testo sul server contenente i dati della sessione
• associa alla sessione un identificatore univoco, accessibile tramite la
funzione session_id()
• costruisce un array associativo superglobale $_SESSION dove le
informazioni sono caricate e accessibili direttamente
Nell’array associativo è possibile salvare tutte le informazioni desiderate come
coppie <chiave, valore>
Programmazione Web - PHP: approfondimenti
7
Memorizzazione di session_id
Qualora i cookie siano abilitati sul browser, l’identificatore della sessione
viene passato al client attraverso un cookie
In caso contrario, è comunque possibile utilizzare le sessioni utilizzando il
meccanismo dell’url rewriting, cioè affiancando una variabile agli URL che
compaiono nella pagina restituita all’utente
Il nome del cookie e della variabile passata via URL viene di default
impostato a PHPSESSID all’interno del file php.ini e si può gestire sia
agendo direttamente sul file oppure utilizzando la funzione session_name()
Programmazione Web - PHP: approfondimenti
8
Caricamento della sessione
Per riesumare una sessione, si usa sempre la funzione session_start()
Dopo che è stata invocata la funzione session_start(), l'interprete PHP
riconosce l’utente dall’ID della sessione, recuperandolo dal cookie o dall’URL
L'interprete PHP carica quindi i dati dal file di testo presente sul server, associato
all’ID della sessione, e li mappa nell’array associativo $_SESSION
Tutte le modifiche apportate a $_SESSION vengono poi riportate nel file di testo al
termine dell’esecuzione dello script
Programmazione Web - PHP: approfondimenti
9
Esempio
Programmazione Web - PHP: approfondimenti
10
…e le successive!
Programmazione Web - PHP: approfondimenti
11
Distruzione di una sessione (I)
Di norma, una sessione ha validità finché il browser è attivo. Per distruggere
esplicitamente la sessione si usa la funzione session_destroy()
Le variabili di sessione sono tuttavia ancora accessibili nello script che ha distrutto
la sessione
Per rimuovere tutte le variabili di sessione si usa la funzione unset
<?php
<?php
session_start();
$_SESSION['nome'] = ‘Devis';
session_destroy();
unset($_SESSION['nome']);
echo $_SESSION['nome'];
session_start();
$_SESSION['nome'] = ‘Devis';
session_destroy();
echo $_SESSION['nome'];
?>
?>
Devis
Programmazione Web - PHP: approfondimenti
12
Distruzione di una sessione (II)
La distruzione di una sessione supportata da cookie implica la rimozione (anche) del
cookie
• nome del cookie relativo all’identificatore della sessione: session_name()
Procedura (completa) di distruzione della sessione:
• rimozione di tutte le variabili di sessione
• se esiste un cookie di sessione, viene rimosso
• distruzione della sessione
Programmazione Web - PHP: approfondimenti
13
Esempio: gestione del login utente
login.php
Programmazione Web - PHP: approfondimenti
14
Esempio: gestione del login utente
login.php
Programmazione Web - PHP: approfondimenti
15
Esempio: gestione del login utente
homePage.php
Programmazione Web - PHP: approfondimenti
16
homePage.php
Programmazione Web - PHP: approfondimenti
17
Esempio: gestione del login utente
offerte.php
Programmazione Web - PHP: approfondimenti
18
Esempio: gestione del login utente
offerte.php
Programmazione Web - PHP: approfondimenti
19
Esempio: gestione del login utente
logout.php
Programmazione Web - PHP: approfondimenti
20
logout.php
Programmazione Web - PHP: approfondimenti
21
Gestione della scadenza delle sessioni
Due gli elementi che tengono in vita una sessione
• l’id della sessione fornito dal client (per esempio tramite i cookie)
• il file con i dati della sessione sul server
Il client smette di trasmettere l’id quando scade il cookie di sessione
• la scadenza è regolata dalla funzione session_set_cookie_param() e
dalla direttiva session.cookie_lifetime del file php.ini
• di default è impostata a 0, vale a dire i cookie scadono alla chiusura del
browser
Il file dei dati di sessione scade dopo un numero di secondi impostato nella direttiva
session.gc_maxlifetime nel file php.ini (default 24 minuti)
• dopo tale scadenza, il file verrà eliminato con una probabilità impostata
dalle direttive session.gc_probability e session.gc_divisor
(default 1%)
Programmazione Web - PHP: approfondimenti
22
Uso dell'URL rewriting
Le informazioni sulle sessioni sono salvate direttamente nei link presenti nella
pagina restituita all’utente:
• Esplicitamente
• Ogni URL nella pagina restituita all’utente sarà impostato come
script.php?<session-name>=<session-id>
• Automaticamente (previsto da PHP4 in poi)
• Va riconfigurato php.ini
ini_set('session.use_trans_sid', false);
• L'URL rewriting (automatico o esplicito) è sconsigliato per motivi di sicurezza
(l’id della sessione appare in chiaro negli URL della pagina)
Programmazione Web - PHP: approfondimenti
23
Upload di file
Gestione dell’upload di file
Input di file mediante: <input type="file" name="fileupload"/>
Attributo enctype nel form: enctype="multipart/form-data"
Informazioni relative al file caricato disponibili nell’array associativo $_FILES,
indicizzato dal valore dell’attributo name specificato nel form di upload
Ogni elemento di $_FILES è un array associativo di 4 elementi:
Programmazione Web - PHP: approfondimenti
25
Form di upload del file (I)
Programmazione Web - PHP: approfondimenti
26
Form di upload del file (II)
Programmazione Web - PHP: approfondimenti
27
Gestione del form di upload del file
Programmazione Web - PHP: approfondimenti
28
Gestione del form di upload del file
Programmazione Web - PHP: approfondimenti
29
Funzioni di manipolazione dei file (I)
Test di esistenza di un file: file_exists()
if(file_exists("grano.jpg"))
echo "Il file esiste!"
else
echo "Il file non esiste!"
Test della natura di un file: is_file(), is_dir()
if(is_file($nome))
echo "$nome è un file!";
else if(is_dir($nome))
echo "$nome è una directory!";
else
echo "$nome non è un file/directory!";
Programmazione Web - PHP: approfondimenti
30
Funzioni di manipolazione dei file (II)
Test di manipolabilità: is_readable(), is_writable(), is_executable()
if(is_readable($nome))
echo "Il file $nome è leggibile!";
if(is_writable($nome))
echo "Il file $nome è scrivibile!";
if(is_executable($nome))
echo "Il file $nome è eseguibile!";
Dimensione di un file: filesize() (restituisce false se ci sono problemi)
echo "La dimensione del file $nome è di " . filesize($nome) . " byte";
Cancellazione di un file: unlink()
unlink($nome);
echo "Il file $nome è stato rimosso";
Programmazione Web - PHP: approfondimenti
31
Funzioni di manipolazione delle directory
Creazione di una directory: mkdir()
mkdir("upload", 0755);
Rimozione di una directory: rmdir()
rmdir("upload");
Programmazione Web - PHP: approfondimenti
32
Funzioni di manipolazione delle directory
Apertura di una directory (per poter leggerla): opendir()
$dir = opendir("upload");
Lettura di una directory: readdir()
<?php
$dir = opendir($nomedir);
if($dir == false)
echo "Errore: impossibile aprire la directory $nomedir";
else
{
while(!(($file = readdir($dir)) === false))
{
if(is_dir("$nomedir/$file"))
echo "(D)";
echo $file . br();
}
closedir($dir);
}
?>
Programmazione Web - PHP: approfondimenti
33
Intestazione HTTP
Gli header HTTP
• Normalmente, PHP è usato per costruire il corpo della risposta HTTP del
server, che per default presenta un’intestazione HTTP standard contenente,
tra gli altri, il tipo MIME del file HTML (text/html)
• Talvolta è necessario gestire le intestazioni del protocollo HTTP (headers)
•Due tipologie di headers
• request headers: inviati dal browser verso il server quando viene
generata una richiesta HTTP (per esempio, tramite il click su un link)
• response headers: inviati dal server al browser in risposta ad una
determinata richiesta (per esempio, sotto forma di comune pagina
HTML)
Programmazione Web - PHP: approfondimenti
35
Headers inviati nella richiesta
• Per visualizzare gli headers inviati nella richiesta si può usare la funzione
getallheaders() che produce un array contenente tutte le informazioni
relative agli headers inviati in input (alias di apache_request_headers())
Programmazione Web - PHP: approfondimenti
36
Headers inviati nella risposta
• Esiste un’analoga funzione apache_response_headers() per
visualizzare gli headers nella risposta HTTP
• Talvolta è necessario modificare/aggiungere altre intestazioni
• per re-dirigere il browser su un’altra pagina (eventualmente dopo un
certo tempo)
• per evitare il caching della pagina
• per modificare il content type della pagina
• ...
• A tale scopo esiste la funzione header()
• La funzione header()deve essere invocata prima di qualsiasi altro output,
di qualunque elemento HTML o di qualunque spazio
Programmazione Web - PHP: approfondimenti
37
38
39
Buffering
• Le intestazioni devono precedere qualunque contenuto, perché una volta che
la pagina inizia ad essere inviata non è più possibile modificare l’intestazione
della risposta HTTP
• Questo vincolo può essere aggirato con il meccanismo del buffering
• la funzione ob_start() viene posta immediatamente prima del
contenuto della pagina, compresi eventuali spazi bianchi
• in tal modo, lo script non inizia ad inviare la pagina fino a quando
non ha terminato la sua esecuzione
• si può ripristinare il consueto meccanismo di emissione immediata
dell’output invocando la funzione ob_end_flush()
Programmazione Web - PHP: approfondimenti
40
Approfodimento sull'uso di array
e stringhe
Array
Array = variabile che contiene un insieme (indicizzato) di elementi
• Elemento: scalare (semplice) o un altro array
• Individuazione degli elementi mediante indicizzazione
numerica
associativa
Programmazione Web - PHP: approfondimenti
42
Array indicizzati numericamente
Creazione di array mediante enumerazione dei suoi elementi:
$strumenti = array('flauto', 'violino', 'oboe', 'liuto');
Creazione di array mediante assegnamento con un altro array:
$a = $strumenti;
$numeri = range(1, 10);
$lettere = range('a', 'z');
$numeri = array(1,2,3,4,5,6,7,8,9,10);
$lettere = array('a','b', ..., 'z');
Creazione di array mediante caricamento da database
Programmazione Web - PHP: approfondimenti
43
Array indicizzati associativamente
Indice rappresentato da un nome (chiave):
$prezzi = array('flauto'=>2500,
'violino'=>8000,
'oboe'=>5400,
'liuto'=>11000);
Programmazione Web - PHP: approfondimenti
44
Operatori per array
$a = array(1,2,3);
$b = array(4,5,6,7,8);
$c = array('1','2','3');
$a
$a
$a
$a
+ $b: (1,2,3,7,8)
== $b: false
== $c: true
=== $c: false
Programmazione Web - PHP: approfondimenti
45
Array multidimensionali (I)
Indicizzazione numerica:
$articoli = array(array('FLT','flauto', 2500),
array('VLN', 'violino', 8000),
array('OBO', 'oboe', 5400),
array('LUT', 'liuto',11000));
Programmazione Web - PHP: approfondimenti
46
Array multidimensionali (II)
Accesso mediante ciclo for:
for($riga=0; $riga<4; $riga++)
{
for($colonna=0; $colonna<3; $colonna++)
echo $articoli[$riga][$colonna] . ' ';
echo '<br/>';
}
FLT
VLN
OBO
LUT
flauto 2500
violino 8000
oboe 5400
liuto 11000
Programmazione Web - PHP: approfondimenti
47
Array multidimensionali (III)
Indicizzazione mista:
$articoli = array(array('codice'=>'FLT',
'strumento'=>'flauto',
'prezzo'=>2500),
array('codice'=>'VLN',
'strumento'=> 'violino',
'prezzo'=>8000),
array('codice'=>'OBO',
'strumento'=>'oboe',
'prezzo'=>5400),
array('codice'=>'LUT',
'strumento'=>'liuto',
'prezzo'=> 11000));
Programmazione Web - PHP: approfondimenti
48
Array multidimensionali (IV)
Accesso mediante ciclo foreach:
foreach($articoli as $articolo)
{
foreach($articolo as $indice => $contenuto)
echo "$indice: $contenuto ";
echo '<br/>';
}
codice:
codice:
codice:
codice:
FLT
VLN
OBO
LUT
strumento:
strumento:
strumento:
strumento:
$articoli
flauto prezzo: 2500
violino prezzo: 8000
oboe prezzo: 5400
liuto prezzo: 11000
Programmazione Web - PHP: approfondimenti
49
Ordinamento di array (I)
Ordinamento di array indicizzati numericamente: sort()
$strumenti = array('flauto', 'violino', 'oboe', 'liuto');
sort($strumenti);
Programmazione Web - PHP: approfondimenti
50
Ordinamento di array (II)
Ordinamento di array indicizzati associativamente: ksort() e asort()
$prezzi = array('flauto'=>2500,
'violino'=>8000,
'oboe'=>5400,
'liuto'=>11000);
ksort($prezzi);
asort($prezzi);
Programmazione Web - PHP: approfondimenti
51
Ordinamento di array (III)
Ordinamento di array in ordine inverso: rsort(), krsort() e
arsort()
rsort($strumenti);
krsort($prezzi);
arsort($prezzi);
Programmazione Web - PHP: approfondimenti
52
Riordinamento casuale di array
Programmazione Web - PHP: approfondimenti
53
Inversione di array
array_reverse($a): genera un array inverso di $a
$inv_str = array_reverse($strumenti);
$inv_art = array_reverse($articoli);
Programmazione Web - PHP: approfondimenti
54
Conteggio di elementi negli array
count($a): restituisce il numero di elementi dell’array $a
array_count_values($a): restituisce un array associativo che indica
la frequenza di ogni elemento nell’array
$a (gli elementi di $a devono
essere
scalari)
Programmazione Web - PHP: approfondimenti
55
Conversione di array associativi in variabili scalari
extract(array a [, int tipologia [, string prefisso]]):
genera un insieme di variabili omonime delle chiavi di a
extract($prezzi);
echo "$flauto $violino $oboe $liuto"
Parametri opzionali:
• tipologia: tipologia di gestione delle collisioni (default: sovrascrittura)
• prefisso: rilevante per certe tipologie di collisione
Programmazione Web - PHP: approfondimenti
56
Caricamento di array da file
Programmazione Web - PHP: approfondimenti
57
Navigazione di array
Array: ha un puntatore interno che punta all’elemento corrente dell’array
(creazione array  punta al primo elemento)
• current($a)  restituisce elemento corrente
• each($a)  restituisce elemento corrente; incrementa puntatore
• next($a)  incrementa puntatore; restituisce elemento corrente
• reset($a)  posiziona puntatore al primo elemento (e lo restituisce)
• end($a)  posiziona puntatore all’ultimo elemento (e lo restituisce)
• prev($a)  decrementa puntatore; restituisce elemento corrente
$a = array("alfa", "beta", "gamma");
$stringa = end($a);
while($stringa)
{
echo "$stringa <br/>";
$stringa = prev($a);
gamma
beta
alfa
}
Programmazione Web - PHP: approfondimenti
58
Pulitura di stringhe
string trim(string stringa): rimozione di spaziatura intorno a
stringa
Spazio bianco ‘ ‘
Newline "\n"
Carriage return "\r"
Tab orizzontale "\t"
Tab verticale "\x0B"
Fine stringa "\0"
$nome = trim($_POST['nome']);
$email = trim($_POST['email']);
string ltrim(string stringa): pulitura solo a sinistra
string rtrim(string stringa): pulitura solo a destra
Programmazione Web - PHP: approfondimenti
59
Rendering dei Newline
string nl2br(string stringa): sostituzione di "\n" con "<br/>”
Programmazione Web - PHP: approfondimenti
60
Formattazione di stringhe per la stampa
void printf(string formato [, mixed args ...])
string sprintf(string formato [, mixed args ...])
formato: specifica del formato della stringa di output mediante codici
args: variabili che istanziano i codici nel formato
echo "Il costo totale è $costo_totale";
Il costo totale è 83,8
printf("Il costo totale è %s", $costo_totale)";
printf("Il costo totale è %.2f", $costo_totale)";
Specifiche di conversione multiple:
Il costo totale è 83,80
printf("Il costo totale è %.2f (con spedizione %.2f)",
$costo_totale, $costo_con_spedizione);
Il costo totale è 83.80 (con spedizione 88.80)
Programmazione Web - PHP: approfondimenti
61
Formattazione di stringhe per la stampa
Sintassi specifica di conversione:
%['carattere-riempimento] [-] [larghezza] [.precisione] codice
Programmazione Web - PHP: approfondimenti
62
Formattazione di stringhe per la stampa
Cambiamento del case (maiuscola-minuscola) di stringhe:
$subject = 'Feedback dal sito web';
Utile nel confronto tra stringhe:
if(strtolower($email) == '[email protected]')
$to = '[email protected]';
else
$to = '[email protected]';
Programmazione Web - PHP: approfondimenti
63
Formattazione di stringhe per la memorizzazione
Problemi nella memorizzazione di stringhe nel database: apici, \, NULL
Inibizione dei metacaratteri mediante backslash: \', \", \\
string addslashes(string stringa)
string stripslashes(string stringa)
$feedback = addslashes(trim($_POST['feedback']));
$feedback = stripslashes($feedback);
Programmazione Web - PHP: approfondimenti
64
Esplosione ed implosione di stringhe
array explode(string separatore, string input [, int limite])
$email_array = explode('@', $email);
if(strtolower($email_array[0] == 'luigi.rossi')
$to = '[email protected]';
else
$to = [email protected]';
string implode(array input, string separatore)
$email = implode($email_array, '@');
string strtok(string input, string separatore): preleva da input un token
alla volta
$token = strtok($feedback, ' ');
do{
echo "$token <br />";
$token = strtok(' ');
} while($token != '');
Prima call  due parametri
Successive call  un solo
parametro (separatore)
Programmazione Web - PHP: approfondimenti
65
Prelievo di sottostringhe
string substr(string stringa, int inizio [, int lung])
inizio: indice da cui prelevare la sottostringa (se negativo  dalla
fine)
lung: numero di caratteri da prelevare (se non specificato  fino alla
fine)
$feedback = 'Il vostro servizio clienti è eccellente';
Programmazione Web - PHP: approfondimenti
66
Confronto di stringhe
int strcmp(string stringa1, string stringa2)
stringa1 == stringa2  risultato = 0
stringa1 > stringa2  risultato > 0
stringa1 < stringa2  risultato < 0
int strnatcmp(string stringa1, string stringa2):
confronto sulla base di un criterio 'naturale' (http://www.naturalordersort.org)
echo strcmp('15', '2');
echo strnatcmp('15', '2');
-1
1
Versioni non sensibili alle maiuscole/minuscole (case insensitive):
strcasecmp()
strnatcasecomp()
Programmazione Web - PHP: approfondimenti
67
Ricerca di sottostringhe
string strstr(string pagliaio, string ago)
se ago trovato nel pagliaio  sottostringa dall’inizio di ago
se ago non trovato nel pagliaio  false
se più occorrenze di ago nel pagliaio  prima occorrenza di ago
Assegnamento del destinatario in base a parole chiave nel feedback:
$to = '[email protected]'; // default
if(strstr($feedback, 'negozio'))
$to = '[email protected]';
elseif(strstr($feedback, 'consegna'))
$to = '[email protected]';
elseif(strstr($feedback, 'fattura'))
$to = '[email protected]';
Varianti:
stristr(): case insensitive
strrchr() sottostringa partendo dall’ultima occorrenza di ago
Programmazione Web - PHP: approfondimenti
68
Ricerca posizione di sottostringhe
int strpos(string pagliaio, string ago [ , int offset ]) 
restituisce la posizione della prima occorrenza di ago in pagliaio
offset: punto in pagliaio da cui iniziare a cercare
se ago non si trova nel pagliaio  false
più veloce di strstr()
$saluto = 'Hello world';
echo strpos($saluto, 'world');
6
echo strpos($saluto, 'l', 5);
9
Se ago non si trova nel pagliaio  false: strpos() rimane non definito
$pos = strpos($saluto, 'Hello');
if($pos === false)
echo 'Non trovato';
else
echo "Trovato alla posizione $pos";
Programmazione Web - PHP: approfondimenti
Trovato alla
posizione 0
69
Sostituzione di sottostringhe (I)
mixed str_replace(mixed ago, mixed nuovo, mixed pagliaio
[ , int &tot ])
sostituisce tutte le occorrenze di ago in pagliaio
restituisce il nuovo pagliaio
se specificato, assegna a tot il numero di sostituzioni effettuate
$saluto = 'Hello world, wonderful world!';
$tot = 0;
echo str_replace('world', 'people', $saluto, $tot)."($tot)";
Possibile passare array invece di stringhe:
$feedback = 'Questo negozio fa schifo! Veramente schifo!';
$censurate = array('schifo', ...);
echo str_replace($censurate, '***', $feedback);
Programmazione Web - PHP: approfondimenti
70
Sostituzione di sottostringhe (I)
mixed str_replace(mixed ago, mixed nuovo, mixed pagliaio
[ , int &tot ])
sostituisce tutte le occorrenze di ago in pagliaio
restituisce il nuovo pagliaio
se specificato, assegna a tot il numero di sostituzioni effettuate
$saluto = 'Hello world, wonderful world!';
$tot = 0;
echo str_replace('world', 'people', $saluto, $tot)."($tot)";
Hello people, wonderful people! (2)
Possibile passare array invece di stringhe:
$feedback = 'Questo negozio fa schifo! Veramente schifo!';
$censurate = array('schifo', ...);
echo str_replace($censurate, '***', $feedback);
Questo negozio fa ***! Veramente ***!
Programmazione Web - PHP: approfondimenti
71
Sostituzione di sottostringhe (III)
string substr_replace(string stringa, string sostituto,
int inizio [ , int lung ])
sostituisce una parte di stringa con sostituto
inizio: posizione di stringa in cui inizia la sostituzione (se negativo,
posizione dalla fine)
lung positiva o nulla  numero di caratteri sostituiti
lung negativa  posizione (dalla fine) su cui terminare la sostituzione
$saluto = 'Hello world';
echo substr_replace($saluto, 'people', 6, 5);
Hello people
echo substr_replace($saluto, 'people ', 6, 0);
Hello people world
echo substr_replace($saluto, 'people ', 6, -2);
Programmazione Web - PHP: approfondimenti
Hello people ld
72
Espressioni regolari
Pattern matching complessi (non semplicemente uguaglianze di stringhe)
Due possibili stili: POSIX, Perl (PCRE)
• Espressione regolare = notazione per specificare un pattern in un testo
• Uso di metacaratteri per specificare particolari pattern
Programmazione Web - PHP: approfondimenti
73
Insiemi di caratteri (I)
Un qualsiasi carattere diverso da \n: .
.emo
compatibile con remo, temo, memo, …
Classe di caratteri: [ lista-di-caratteri ]
[aeiou]
[a-z]
vocali
range delle lettere alfabetiche minuscole
[a-zA-Z]
range delle lettere alfabetiche
[^a-z]
qualsiasi carattere che non sia una lettera alfabetica
minuscola
[^aeiou]
qualsiasi carattere che non sia una lettera vocale
Programmazione Web - PHP: approfondimenti
74
Insiemi di caratteri (II)
Classi di caratteri predefinite:
Programmazione Web - PHP: approfondimenti
75
Ripetizione e alternativa
Ripetizione zero o più volte del pattern: *
[aeiou]*
Zero o più vocali
Lettera seguita da zero o più caratteri
alfanumerici (identificatore)
[[:alpha:]][[:alnum:]]*
Ripetizione una o più volte del pattern: +
[[:digit:]]+
Una o più cifre decimali (numero intero)
[[:digit:]]+,[[:digit:]]+
Numero reale con parte decimale
Opzionalità: ?
[[:digit:]]+[aeiou]?
Alternativa: |
Numero eventualmente seguito da una vocale
org|net|com
Programmazione Web - PHP: approfondimenti
76
Sottoespressioni
Possibile raggruppare sottoespressioni mediante parentesi:
grande
(molto )*grande
molto grande
molto molto grande …
Ripetizione di un pattern un numero vincolato di volte: { limiti }
[[:digit:]]{16}
Numero intero di 16 cifre decimali
molto grande
(molto ){1,3}grande
molto molto grande
molto molto molto grande
molto molto grande
(molto ){2,}grande
molto molto molto grande
molto molto molto molto grande
Programmazione Web - PHP: approfondimenti
77
Ancoraggio
Possibile specificare la posizione di una sottostringa:
Hello world
^Hello
Hello people
Hello everybody
Hello world
world$
Beutfiful world
Best world
^[[:alpha:]][[:alnum:]]*$
[[:<:]][[:digit:]]+[[:>:]]
Stringa costituita unicamente da un
identificatore
123 alfa25 460
Programmazione Web - PHP: approfondimenti
78
Caratteri speciali
Per inibire i caratteri speciali al di fuori di [ ], è necessario precederli con \
Meglio inserire il pattern tra apici singoli (non doppi):
12.0
'[[:digit:]]+\.[[:digit:]]+'
0.14
13.156
Se pattern tra apici doppi  parsing della stringa  necessari ulteriori \
"[[:digit:]]+\\.[[:digit:]]+"
Programmazione Web - PHP: approfondimenti
79
Applicazione del modulo di feedback
Rilevazione di particolari termini nel feedback del cliente:
negozio|consegna|fattura
Controllo nome del cliente:
Luigi Rossi
G. Luigi Rossi
G.C. Luigi Rossi
^(([[:upper:]]\.)+ )?[[:upper:]][[:lower:]]+ [[:upper:]][[:lower:]]+$
Controllo formato indirizzo di email:
[email protected]
^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9_.-]+$
Programmazione Web - PHP: approfondimenti
80
Ricerca di sottostringhe con espressioni regolari
bool ereg(string pattern, string stringa)
• stabilisce se stringa contiene una sottostringa compatibile con
pattern
• case-sensitive
Variante case-insensitive: eregi()
Programmazione Web - PHP: approfondimenti
81
Ricerca di sottostringhe con espressioni regolari
string ereg_replace(string pattern, string sostituto, string
stringa)
sostituisce con sostituto tutte le sottostringhe di stringa compatibili con
pattern
restituisce il risultato della sostituzione (funzionale: stringa non cambia!)
Variante case-insensitive: eregi_replace()
$transazione = 'Carta di credito: 4367-2234-1245-3200';
$pattern = '[[:digit:]]{4}(-[[:digit:]]{4}){3}';
echo ereg_replace($pattern, 'xxxx-xxxx-xxxx-xxxx', $transazione);
Carta di credito: xxxx-xxxx-xxxx-xxxx
$stringa = 'alfa 23beta gamma48 125';
$pattern = '[[:<:]][[:digit:]]+[[:>:]]';
echo ereg_replace($pattern, 'NUM', $stringa);
alfa 23beta gamma48 NUM
Programmazione Web - PHP: approfondimenti
82
Dividere stringhe con espressioni regolari
array split(string pattern, string stringa [, int max])
• restituisce l’array di stringhe ottenuto dividendo stringa limitata dai confini
compatibili con pattern
• max: numero massimo di elementi nell’array risultante
$email = '[email protected]';
$a = split('\.|@', $email);
$espressione = '3*52+24/5-12';
$operandi = split('[-+*/]', $espressione);
Programmazione Web - PHP: approfondimenti
83
Funzioni deprecated
ereg(‘pattern’,’stringa’)  sostituito da
preg_match(‘/pattern/’,’stringa’)
eregi(‘pattern’,’stringa’)  sostituito da
preg_match(‘/pattern/i’,’stringa’)
ereg_replace(‘pattern’,’sostituto’,’stringa’)  sostituito da
preg_replace(‘/pattern/’,’sostituto’,’stringa’)
uso di ‘/pattern/i’ in caso di eregi_replace
split(‘pattern’,’stringa’)  sostituito da
preg_split(‘/pattern/’,’stringa’)
Programmazione Web - PHP: approfondimenti
84
Scarica

L5_PHP_approfondimenti