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