Le espressioni regolari.

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Le espressioni regolari."

Transcript

1 Lezione 8 Le espressioni regolari. Le espressioni regolari. Corrispondenze e classi di caratteri. Le regular expressions (espressioni regolari) servono per descrivere dei modelli di stringa. E possibile verificare, ad esempio, se un codice fiscale o un indirizzo sono stati inseriti correttamente. Infatti, le funzioni viste la volta scorsa non sono molto flessibile e potenti come lo strumento che vedremo in questa lezione. E bene dire però, che l uso delle espressioni regolari porta un sensibile overhead di esecuzione; quindi, dove è possibile usare le funzioni dedicate alle stringhe è inutile utilizzare le espressioni regolari, che portano un aumento del tempo di esecuzione. PHP supporta sia le espressioni regolari che seguono lo standard POSIX sia quelle stile Perl (Perl regular expressions). Noi ci occuperemo del primo gruppo. Daremo comunque un cenno anche alle espressioni regolari Perl, più complicate da apprendere ma anche più potenti. Corrispondenze e classi di caratteri. Con la funzione ereg() si possono intercettare le corrispondenze di modelli nelle stringhe. La sintassi della funzione è la seguente : Sintassi: $res = ereg( modello,$stringa,$array); La funzione ereg() restituisce il numero di caratteri trovati nelle corrispondenze e memorizza in $array le corrispondenze trovate nella variabile $stringa, in base al modello usato. La difficoltà nell uso delle espressioni regolari sta proprio nel capire la sintassi dei modelli. Essi possono essere semplici caratteri, contenere quantificatori, classi di caratteri. Ad esempio : $num=ereg( gio, ciao Gigio,$array); print $num. ---.$array[0]; L output sarà 3---gio. Per apprezzare però le qualità delle regular expressions si osservi attentamente la seguente tabella : Simbolo Funzione Esempio. Qualsiasi carattere g. successivo.? Nessuna o una istanza del g? carattere. * Nessuna o più istanze del g* carattere. + Una o più istanze. g+ n Esattamente n istanze g2 successive del carattere. n, n o più istanze. g2,,n Al massimo n istanze. g,3 n,m Trova le corrispondenze g2,3 con almeno n istanze ma

2 Corrispondenze e classi di caratteri. al massimo m istanze. Prima di far vedere qualche esempio utile, bisogna parlare delle classi di caratteri. Le classi permettono di trovare le corrispondenze di un carattere appartenente ad una determinata classe, come un numero, un carattere alfabetico e così via. Nella tabella sono riportati esempi di classi : Classe Descrizione Esempio [a-z] Trova tutti i caratteri minuscoli. [a-z]4 : Trova un gruppo di 4 caratteri minuscoli. [A-Z] Trova i caratteri maiuscoli. [A-Z]+ : Trova una o più istanze di un carattere maiuscolo. [0-9] Trova un numero. [0-9]5 : Trova un gruppo di 5 numeri (ad esempio un CAP). [^0-9] Trova tutto ciò che è diverso da un numero. [^0-9]* : Trova tutto ciò che non è un numero. Parliamo ora di atomi. Racchiudendo fra parentesi un modello e sfruttando i simboli quantificatori visti nella prima tabella, è possibile formulare complesse espressioni regolari. A titolo di esempio, riportiamo vari blocchi di codice per controllare, ad esempio, dei dati ricevuti dall utente tramite un form HTML (parleremo più avanti nel corso come inviare dati ad uno script PHP tramite i form) : if ((empty($nominativo)) (ereg("[^a-za-z\ ]+",$nominativo,$array))) print $nominativo. Non è un dato corretto ; Come vedete, se la variabile $nominativo è vuota o all interno sono stati trovate una o più corrispondenze di caratteri non alfabetici (compreso lo spazio), viene segnalato un messaggio di errore. if ((empty($ )) (ereg("([\ \<\>\\\/]+)",$ ,$array))) print $ . Non è un indirizzo corretto ; Non spaventatevi!;) L istruzione if precedente dovrebbe essere scritta su una sola riga. Analizziamo con calma l espressione booleana. Se $ è vuota oppure è diversa dal modello descritto in ereg(), viene segnalato errore. Il modello può essere spiegato semplicemente nel seguente modo : il primo atomo verifica una o più occorrenze di caratteri alfanumerici, compreso il punto (si noti il carattere di escape \ davanti al punto, per evitare che ci sia ambiguità con il carattere di controllo visto prima). Il secondo atomo si accerta della presenza di un unica occorrenza del Il terzo atomo e quarto atomo verificano la presenza di almeno 2 occorrenze di caratteri alfanumerici, seguiti da un punto,e seguiti ancora da almeno 2 caratteri alfanumerici.

3 Lezione 8 Le espressioni regolari. Manipolazione di stringhe tramite le RE. La seconda chiamata ad ereg() serve per controllare che non siano presenti caratteri strani del tipo <,>,\,,/ (tutti preceduti da caratteri di escape), per evitare manovre strane da utenti maliziosi. Questa purtroppo non è la sede adatta per parlare di problemi di sicurezza, ma vi consiglio caldamente di approfondire l argomento se volete intraprendere la carriera del programmatore web professionista. Non avete idea di quanti portali (del valore anche di centinaia di milioni) sono vulnerabili non per via del software utilizzato, come un particolare server web, ma per colpa di una cattiva programmazione o gestione del sito (su molti siti è possibile visualizzare user e password di connessione al database in chiaro, e la cosa grave è che alcuni utilizzano le stesse password sia per accedere alle cartelle del sito via ftp che per connettersi al database!!!). Adesso un altro esempio utile : if ((empty($codice)) (!ereg("([a-za-z])6([0-9])2([a-za-z])1([0-9])2([aza-z])1([0-9])3([a-za-z])1",$codice,$array))) print $codice. Non è un codice fiscale corretto ; Conoscendo la struttura di un codice fiscale, è possibile scrivere un semplice modello per un espressione regolare che verifichi la correttezza di questo dato. Infatti, un corretto codice fiscale può essere MDNTMS68C23E101W. Come potete osservare, l espressione regolare rispecchia fedelmente la struttura, cioè prima sei caratteri alfabetici, poi due cifre decimali etc. etc. Manipolazione di stringhe tramite le RE. Una funzione molto utile è la ereg_replace(), per sostituire modelli nelle stringhe. L unica differenza con ereg(), è il fatto che ereg_replace(), oltre a trovare le corrispondenze, effettua anche una sostituzione, ritornando la stringa manipolata : Sintassi: $stringa_res=ereg_replace(modello,replacement,$stringa); Tralasciando il semplice esempio di sostituzione di stringa (effettuabile più efficacemente con la funzione str_replace() vista nella scorsa lezione), introduciamo anche l uso dei riferimenti all indietro con ereg_replace(). Si racchiudono tra parentesi i singoli elementi di espressione regolare. Nel replacement, ognuno di essi sarà identificato da un numero intero di sequenza. Ad ogni atomo di espressione regolare, è possibile applicare una diversa sostituzione. Presentiamo un esempio classico: convertiamo una data in formato mm/gg/aaaa in gg/mm/aaaa : $date=02/28/2002; $data=ereg_replace( ([0-9]+)/([0-9]+)/ ([0-9]+),\\2/\\1/\\3,$date); $data conterrà la stringa 28/02/2002.

4 Un cenno alle espressioni regolari Perl. Un cenno alle espressioni regolari Perl. Le espressioni regolari Perl possono tornare utili in alcuni casi. Parleremo brevemente delle PCRE dando giusto qualche esempio e qualche spunto da cui poter studiare in seguito. Una PCRE viene racchiusa dai delimitatori /. La funzione simile alla ereg() vista prima è la preg_match() : $testo= Antongianni ; if ((preg_match( /i.n/,$testo,$array) ) print $array[0]; //stampa ian Se utilizziamo invece la /i.*n/ viene stampato iann (* significa quanti più caratteri è possibile prima della n). Usando /i.?n/ (? = quanti meno caratteri è possibile prima di una n), viene stampato di nuovo ian. Tramite preg_match_all() è possibile memorizzare in $array tutte le occorrenze trovate (mentre con le POSIX RE ciò non è possibile in maniera immediata). Tramite la funzione preg_replace(), è possibile impostare dei parametri per permettere la sostituzione non di tutte le occorrenze (come avviene per la ereg_replace()), ma un numero prefissato di occorrenze. Immaginiamo di voler analizzare l url da cui proviene un utente, prelevando soltanto il dominio principale (cioè da vogliamo soltanto analizzare ). Infatti, in un sistema di votazione, vogliamo controllare che il voto provenga da un determinato dominio inserito in un database. Ma se nel database l utente ha inserito un indirizzo del tipo ma vuole permettere anche la votazione dalle altre pagine del sito, bisogna verificare soltanto la presenza del dominio principale e non dell url esatto da cui proviene il voto. $siteurl= ; if ($test=substr($siteurl,-1)<>'/') $siteurl.='/'; //aggiunge / serve per la preg_match preg_match("/h.*?\/\/.*?\//",$siteurl,$array); $dominio=$array[0]; //inserisce soltanto il dominio base if (strstr($http_referer,$dominio)) print ok, voto valido perchè proveniente dal dominio registrato ; La preg_match() preleva tutto ciò che inizia con h fino alla terza occorrenza di una barra inversa (/). Quindi, nel nostro esempio, $dominio conterrà la stringa $HTTP_REFERER è una variabile globale che contiene l indirizzo di provenienza (ad esempio ). Tramite la funzione strstr() viene verificata la presenza della sottostringa $dominio all interno dell url di provenienza.

5 Lezione 8 Le espressioni regolari. Un cenno alle espressioni regolari Perl. Anche per questa volta è tutto. Nella prossima lezione parleremo delle funzioni PHP dedicate ai files. Non mancate!! 2002 By Domenico Nappo aka WebdoM. L autore declina ogni responsabilità per eventuali (quanto improbabili) danni recati al sistema per l uso degli script di esempio riportati in questa guida.

Lavorare con MySQL Parte Seconda.

Lavorare con MySQL Parte Seconda. Lavorare con MySQL Parte Seconda. PHP, dalla versione 4.0, usufruisce difunzioni native per colloquiare con MySQL, senza appoggiarsi ad alcuna libreria o modulo esterno. In questa lezione verranno esaminate

Dettagli

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment Obiettivi d esame PHP Developer Fundamentals on MySQL Environment 1.0 Ambiente di sviluppo 1.1 Web server e database MySQL Comprendere la definizione dei processi che si occupano di fornire i servizi web

Dettagli

Interazione con l utente : i moduli.

Interazione con l utente : i moduli. Interazione con l utente : i moduli. Nelle lezioni fin qui riportate, non abbiamo mai trattato l input di utente. Nelle applicazioni web, l input dell utente si acquisisce tramite i moduli (o FORM) HTML.

Dettagli

Indice. 1.13 Configurazione di PHP 26 1.14 Test dell ambiente di sviluppo 28

Indice. 1.13 Configurazione di PHP 26 1.14 Test dell ambiente di sviluppo 28 Indice 25 184 Introduzione XI Capitolo 1 Impostazione dell ambiente di sviluppo 2 1.1 Introduzione ai siti Web dinamici 2 1.2 Impostazione dell ambiente di sviluppo 4 1.3 Scaricamento di Apache 6 1.4 Installazione

Dettagli

--- PREMESSE INTRODUZIONE. .:luxx:.

--- PREMESSE INTRODUZIONE. .:luxx:. SQL INJECTION --- SICUREZZA.:luxx:. PREMESSE Questa guida accenna ad alcuni metodi di SQL injection e si sofferma sulla prevenzione di tali attacchi, per comprendere al meglio il testo è necessaria una

Dettagli

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione Automatizzare i compiti ripetitivi I file batch Anno accademico 2000-01 1 Spesso capita di dover eseguire ripetutatmente una data sequenza di comandi Introdurli uno a uno da tastiera è un processo lento

Dettagli

Clicca sul link Gmail in alto nella pagina. Arriverai ad una pagina simile alla seguente: G. Pettarin ECDL Modulo 7: Internet 68

Clicca sul link Gmail in alto nella pagina. Arriverai ad una pagina simile alla seguente: G. Pettarin ECDL Modulo 7: Internet 68 G. Pettarin ECDL Modulo 7: Internet 68 Usiamo Gmail In questo capitolo vedremo come creare un proprio accesso alla posta elettronica (account) ad uno dei servizi di mail on line più diffusi: Gmail, la

Dettagli

Richiesta pagina PHP (es: index.php)

Richiesta pagina PHP (es: index.php) PHP PHP = personal home page SERVER Richiesta pagina PHP (es: index.php) Server Web (Apache) in ascolto sulla porta 80, si accorge che la pagina richiesta è una pagina PHP in base all'estensione o con

Dettagli

Introduzione al PHP. Fig-1 Colloquio Client-Server-PHP. Domenico Nappo Domenico Surace - Manuali.Net Tutti i diritti riservati

Introduzione al PHP. Fig-1 Colloquio Client-Server-PHP. Domenico Nappo Domenico Surace - Manuali.Net Tutti i diritti riservati Lezione 1 Introduzione al PHP. Cos è il PHP? Introduzione al PHP. Questa prima lezione sarà puramente introduttiva. Spiegheremo cosa è PHP, quali sono le sue potenzialità, impareremo a configurare la nostra

Dettagli

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER L architettura CLIENT SERVER è l architettura standard dei sistemi di rete, dove i computer detti SERVER forniscono servizi, e computer detti CLIENT, richiedono

Dettagli

PHP e Structured Query Language

PHP e Structured Query Language Esercitazioni del corso di Tecnologie per la Comunicazione Aziendale PHP e Structured Query Language Marco Loregian loregian@disco.unimib.it www.siti.disco.unimib.it/didattica/tca2008 Interrogazioni (ripasso)

Dettagli

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop

SMS IN. Rules SMS IN. Rules. Geodrop. Geodrop SMS IN Rules SMS IN Rules } Geodrop Geodrop SMS In 2.3 Regole per la manipolazione dei messaggi Guida alla scrittura di condizioni complesse Guida alle condizioni complesse v1.0-it, 7 Dicembre 2012 Indice

Dettagli

JAVASCRIPT. Tale file è associato alla pagina web mediante il tag