Programmazione Web PHP e MySQL 1. 2Programmazione Web - PHP e MySQL Esempio: un blog.
Programmazione Web Approfondimenti di PHP. Gestione dello stato.
-
Upload
massimiliano-baldini -
Category
Documents
-
view
225 -
download
2
Transcript of Programmazione Web Approfondimenti di PHP. Gestione dello stato.
Programmazione WebApprofondimenti di PHP
Gestione dello stato
3
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
4
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
5
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
6
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
7
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
8
Memorizzazione di session_idQualora 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
9
Caricamento della sessionePer 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
10
Esempio
Programmazione Web - PHP: approfondimenti
11
…e le successive!
Programmazione Web - PHP: approfondimenti
12
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
session_start(); $_SESSION['nome'] = ‘Devis'; session_destroy(); echo $_SESSION['nome']; ?>
<?php
session_start(); $_SESSION['nome'] = ‘Devis'; session_destroy(); unset($_SESSION['nome']); echo $_SESSION['nome']; ?>
Devis
Programmazione Web - PHP: approfondimenti
13
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
14
Esempio: gestione del login utentelogin.php
Programmazione Web - PHP: approfondimenti
15
Esempio: gestione del login utentelogin.php
Programmazione Web - PHP: approfondimenti
16
Esempio: gestione del login utentehomePage.php
Programmazione Web - PHP: approfondimenti
17
homePage.php
Programmazione Web - PHP: approfondimenti
18
Esempio: gestione del login utenteofferte.php
Programmazione Web - PHP: approfondimenti
19
Esempio: gestione del login utenteofferte.php
Programmazione Web - PHP: approfondimenti
20
Esempio: gestione del login utentelogout.php
Programmazione Web - PHP: approfondimenti
21
logout.php
Programmazione Web - PHP: approfondimenti
22
Gestione della scadenza delle sessioniDue 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
23
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
• Automaticamente (previsto da PHP4 in poi)• Va riconfigurato php.ini
• L'URL rewriting (automatico o esplicito) è sconsigliato per motivi di sicurezza (l’id della sessione appare in chiaro negli URL della pagina)
script.php?<session-name>=<session-id>
ini_set('session.use_trans_sid', false);
Programmazione Web - PHP: approfondimenti
Upload di file
25
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
26
Form di upload del file (I)
Programmazione Web - PHP: approfondimenti
27
Form di upload del file (II)
Programmazione Web - PHP: approfondimenti
28
Gestione del form di upload del file
Programmazione Web - PHP: approfondimenti
29
Gestione del form di upload del file
Programmazione Web - PHP: approfondimenti
30
Funzioni di manipolazione dei file (I)
Test di esistenza di un file: file_exists() Test della natura di un file: is_file(), is_dir()
if(file_exists("grano.jpg")) echo "Il file esiste!"else echo "Il file non esiste!"
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
31
Funzioni di manipolazione dei file (II)Test di manipolabilità: is_readable(), is_writable(), is_executable()
Dimensione di un file: filesize() (restituisce false se ci sono problemi) Cancellazione di un file: unlink()
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!";
echo "La dimensione del file $nome è di " . filesize($nome) . " byte";
unlink($nome);echo "Il file $nome è stato rimosso";
Programmazione Web - PHP: approfondimenti
32
Funzioni di manipolazione delle directoryCreazione di una directory: mkdir()
Rimozione di una directory: rmdir()
mkdir("upload", 0755);
rmdir("upload");
Programmazione Web - PHP: approfondimenti
33
Funzioni di manipolazione delle directory
Apertura di una directory (per poter leggerla): opendir()
Lettura di una directory: readdir()
$dir = opendir("upload");
<?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
Intestazione HTTP
35
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
36
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
37
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
38
39
40
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
Approfodimento sull'uso di array e stringhe
42
Array
Array = variabile che contiene un insieme (indicizzato) di elementi
• Elemento: scalare (semplice) o un altro array• Individuazione degli elementi mediante indicizzazione
associativa
numerica
Programmazione Web - PHP: approfondimenti
43
Array indicizzati numericamente
Creazione di array mediante enumerazione dei suoi elementi:
Creazione di array mediante assegnamento con un altro array:
Creazione di array mediante caricamento da database
$strumenti = array('flauto', 'violino', 'oboe', 'liuto');
$a = $strumenti;
$numeri = range(1, 10); $numeri = array(1,2,3,4,5,6,7,8,9,10);
$lettere = range('a', 'z'); $lettere = array('a','b', ..., 'z');
Programmazione Web - PHP: approfondimenti
44
Array indicizzati associativamente
Indice rappresentato da un nome (chiave):
$prezzi = array('flauto'=>2500, 'violino'=>8000, 'oboe'=>5400, 'liuto'=>11000);
Programmazione Web - PHP: approfondimenti
45
Operatori per array
$a = array(1,2,3);$b = array(4,5,6,7,8);$c = array('1','2','3');
$a + $b: (1,2,3,7,8)$a == $b: false$a == $c: true$a === $c: false
Programmazione Web - PHP: approfondimenti
46
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
47
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 flauto 2500 VLN violino 8000 OBO oboe 5400 LUT liuto 11000
Programmazione Web - PHP: approfondimenti
48
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
49
Array multidimensionali (IV)
Accesso mediante ciclo foreach:
foreach($articoli as $articolo){ foreach($articolo as $indice => $contenuto) echo "$indice: $contenuto "; echo '<br/>';}
codice: FLT strumento: flauto prezzo: 2500 codice: VLN strumento: violino prezzo: 8000 codice: OBO strumento: oboe prezzo: 5400 codice: LUT strumento: liuto prezzo: 11000
$articoli
Programmazione Web - PHP: approfondimenti
50
Ordinamento di array (I)
Ordinamento di array indicizzati numericamente: sort() $strumenti = array('flauto', 'violino', 'oboe', 'liuto');sort($strumenti);
Programmazione Web - PHP: approfondimenti
51
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
52
Ordinamento di array (III)
Ordinamento di array in ordine inverso: rsort(), krsort() e arsort()
rsort($strumenti);
krsort($prezzi);
arsort($prezzi);
Programmazione Web - PHP: approfondimenti
53
Riordinamento casuale di array
Programmazione Web - PHP: approfondimenti
54
Inversione di arrayarray_reverse($a): genera un array inverso di $a
$inv_str = array_reverse($strumenti);
$inv_art = array_reverse($articoli);
Programmazione Web - PHP: approfondimenti
55
Conteggio di elementi negli arraycount($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 esserescalari)
Programmazione Web - PHP: approfondimenti
56
Conversione di array associativi in variabili scalari
extract(array a [, int tipologia [, string prefisso]]): genera un insieme di variabili omonime delle chiavi di a
Parametri opzionali:• tipologia: tipologia di gestione delle collisioni (default: sovrascrittura)• prefisso: rilevante per certe tipologie di collisione
extract($prezzi);echo "$flauto $violino $oboe $liuto"
Programmazione Web - PHP: approfondimenti
57
Caricamento di array da file
Programmazione Web - PHP: approfondimenti
58
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
59
Pulitura di stringhestring 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"
string ltrim(string stringa): pulitura solo a sinistra string rtrim(string stringa): pulitura solo a destra
$nome = trim($_POST['nome']);$email = trim($_POST['email']);
Programmazione Web - PHP: approfondimenti
60
Rendering dei Newlinestring nl2br(string stringa): sostituzione di "\n" con "<br/>”
Programmazione Web - PHP: approfondimenti
61
Formattazione di stringhe per la stampavoid printf(string formato [, mixed args ...])string sprintf(string formato [, mixed args ...])
formato: specifica del formato della stringa di output mediante codiciargs: variabili che istanziano i codici nel formato
Specifiche di conversione multiple:
echo "Il costo totale è $costo_totale";
printf("Il costo totale è %s", $costo_totale)";
printf("Il costo totale è %.2f", $costo_totale)";
Il costo totale è 83,8
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
62
Formattazione di stringhe per la stampa
Sintassi specifica di conversione: %['carattere-riempimento] [-] [larghezza] [.precisione] codice
Programmazione Web - PHP: approfondimenti
63
Formattazione di stringhe per la stampaCambiamento del case (maiuscola-minuscola) di stringhe:
Utile nel confronto tra stringhe:
$subject = 'Feedback dal sito web';
if(strtolower($email) == '[email protected]') $to = '[email protected]';else $to = '[email protected]';
Programmazione Web - PHP: approfondimenti
64
Formattazione di stringhe per la memorizzazione
Problemi nella memorizzazione di stringhe nel database: apici, \, NULLInibizione dei metacaratteri mediante backslash: \', \", \\
string addslashes(string stringa)string stripslashes(string stringa)
$feedback = addslashes(trim($_POST['feedback'])); $feedback = stripslashes($feedback);
Programmazione Web - PHP: approfondimenti
65
Esplosione ed implosione di stringhearray explode(string separatore, string input [, int limite])
string implode(array input, string separatore)
string strtok(string input, string separatore): preleva da input un token alla volta
$email_array = explode('@', $email); if(strtolower($email_array[0] == 'luigi.rossi') $to = '[email protected]';else $to = [email protected]';
$email = implode($email_array, '@');
$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
66
Prelievo di sottostringhestring 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
67
Confronto di stringheint strcmp(string stringa1, string stringa2)
stringa1 == stringa2 risultato = 0stringa1 > stringa2 risultato > 0stringa1 < stringa2 risultato < 0
int strnatcmp(string stringa1, string stringa2):confronto sulla base di un criterio 'naturale' (http://www.naturalordersort.org)
Versioni non sensibili alle maiuscole/minuscole (case insensitive): strcasecmp()strnatcasecomp()
echo strcmp('15', '2');
echo strnatcmp('15', '2');
-1
1
Programmazione Web - PHP: approfondimenti
68
Ricerca di sottostringhestring strstr(string pagliaio, string ago)
se ago trovato nel pagliaio sottostringa dall’inizio di agose ago non trovato nel pagliaio falsese più occorrenze di ago nel pagliaio prima occorrenza di ago
Assegnamento del destinatario in base a parole chiave nel feedback:
Varianti:stristr(): case insensitivestrrchr() sottostringa partendo dall’ultima occorrenza di ago
$to = '[email protected]'; // defaultif(strstr($feedback, 'negozio')) $to = '[email protected]';elseif(strstr($feedback, 'consegna')) $to = '[email protected]';elseif(strstr($feedback, 'fattura')) $to = '[email protected]';
Programmazione Web - PHP: approfondimenti
69
Ricerca posizione di sottostringheint strpos(string pagliaio, string ago [ , int offset ])
restituisce la posizione della prima occorrenza di ago in pagliaiooffset: punto in pagliaio da cui iniziare a cercarese ago non si trova nel pagliaio falsepiù veloce di strstr()
Se ago non si trova nel pagliaio false: strpos() rimane non definito
$saluto = 'Hello world';echo strpos($saluto, 'world');
echo strpos($saluto, 'l', 5);
$pos = strpos($saluto, 'Hello');if($pos === false) echo 'Non trovato';else echo "Trovato alla posizione $pos";
Trovato alla
posizione 0
6
9
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 pagliaiorestituisce il nuovo pagliaiose specificato, assegna a tot il numero di sostituzioni effettuate
Possibile passare array invece di stringhe:
$saluto = 'Hello world, wonderful world!';$tot = 0;echo str_replace('world', 'people', $saluto, $tot)."($tot)";
$feedback = 'Questo negozio fa schifo! Veramente schifo!';
$censurate = array('schifo', ...);
echo str_replace($censurate, '***', $feedback);
Programmazione Web - PHP: approfondimenti
71
Sostituzione di sottostringhe (I)mixed str_replace(mixed ago, mixed nuovo, mixed pagliaio [ , int &tot ])
sostituisce tutte le occorrenze di ago in pagliaiorestituisce il nuovo pagliaiose specificato, assegna a tot il numero di sostituzioni effettuate
Possibile passare array invece di stringhe:
$saluto = 'Hello world, wonderful world!';$tot = 0;echo str_replace('world', 'people', $saluto, $tot)."($tot)";
$feedback = 'Questo negozio fa schifo! Veramente schifo!';
$censurate = array('schifo', ...);
echo str_replace($censurate, '***', $feedback);
Hello people, wonderful people! (2)
Questo negozio fa ***! Veramente ***!
Programmazione Web - PHP: approfondimenti
72
Sostituzione di sottostringhe (III)string substr_replace(string stringa, string sostituto, int inizio [ , int lung ])
sostituisce una parte di stringa con sostitutoinizio: 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);
echo substr_replace($saluto, 'people ', 6, 0);
echo substr_replace($saluto, 'people ', 6, -2);
Hello people
Hello people world
Hello people ld
Programmazione Web - PHP: approfondimenti
73
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
74
Insiemi di caratteri (I)Un qualsiasi carattere diverso da \n: .
Classe di caratteri: [ lista-di-caratteri ]
.emo
[aeiou]
[a-z]
[a-zA-Z]
[^a-z]
[^aeiou]
compatibile con remo, temo, memo, …
vocali
range delle lettere alfabetiche minuscole
range delle lettere alfabetiche
qualsiasi carattere che non sia una lettera alfabetica minuscola
qualsiasi carattere che non sia una lettera vocale
Programmazione Web - PHP: approfondimenti
75
Insiemi di caratteri (II)Classi di caratteri predefinite:
Programmazione Web - PHP: approfondimenti
76
Ripetizione e alternativaRipetizione zero o più volte del pattern: *
Ripetizione una o più volte del pattern: +
Opzionalità: ?
Alternativa: |
[aeiou]*
[[:alpha:]][[:alnum:]]*
[[:digit:]]+
[[:digit:]]+,[[:digit:]]+
[[:digit:]]+[aeiou]?
org|net|com
Zero o più vocali
Lettera seguita da zero o più caratteri alfanumerici (identificatore)
Una o più cifre decimali (numero intero)
Numero reale con parte decimale
Numero eventualmente seguito da una vocale
Programmazione Web - PHP: approfondimenti
77
SottoespressioniPossibile raggruppare sottoespressioni mediante parentesi:
Ripetizione di un pattern un numero vincolato di volte: { limiti }
(molto )*grandegrande
molto grande
molto molto grande …
[[:digit:]]{16}
(molto ){1,3}grande
(molto ){2,}grande
Numero intero di 16 cifre decimali
molto grande
molto molto grande
molto molto molto grande
molto molto grande
molto molto molto grande
molto molto molto molto grandeProgrammazione Web - PHP: approfondimenti
78
AncoraggioPossibile specificare la posizione di una sottostringa:
^Hello
world$
^[[:alpha:]][[:alnum:]]*$
[[:<:]][[:digit:]]+[[:>:]]
Hello world
Hello people
Hello everybody
Hello world
Beutfiful worldBest world
Stringa costituita unicamente da un identificatore
123 alfa25 460
Programmazione Web - PHP: approfondimenti
79
Caratteri speciali
Per inibire i caratteri speciali al di fuori di [ ], è necessario precederli con \
Meglio inserire il pattern tra apici singoli (non doppi):
Se pattern tra apici doppi parsing della stringa necessari ulteriori \
'[[:digit:]]+\.[[:digit:]]+'12.0
0.14
13.156
"[[:digit:]]+\\.[[:digit:]]+"
Programmazione Web - PHP: approfondimenti
80
Applicazione del modulo di feedback
Rilevazione di particolari termini nel feedback del cliente:
Controllo nome del cliente:
Controllo formato indirizzo di email:
negozio|consegna|fattura
Luigi Rossi
G. Luigi Rossi
G.C. Luigi Rossi
^(([[:upper:]]\.)+ )?[[:upper:]][[:lower:]]+ [[:upper:]][[:lower:]]+$
^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9_.-]+$
Programmazione Web - PHP: approfondimenti
81
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
82
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);
$stringa = 'alfa 23beta gamma48 125';
$pattern = '[[:<:]][[:digit:]]+[[:>:]]';
echo ereg_replace($pattern, 'NUM', $stringa);
Carta di credito: xxxx-xxxx-xxxx-xxxx
alfa 23beta gamma48 NUM
Programmazione Web - PHP: approfondimenti
83
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
84
Funzioni deprecatedereg(‘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