# PHP/Programmazione/Regexp

PHP
Copertina Tutti i moduli · Sviluppo
    CopertinaPHP/Copertina
* IntroduzionePHP/Introduzione
** StoriaPHP/Introduzione/Storia
** Come funzionaPHP/Introduzione/Come funziona
* Installazione e configurazionePHP/Installazione e configurazione
** InstallazionePHP/Installazione
*** LinuxPHP/Installazione/Linux
*** WindowsPHP/Installazione/Windows
*** Mac OS XPHP/Installazione/Mac OS X
** ConfigurazionePHP/Configurazione
* ProgrammazionePHP/Programmazione
** CommentiPHP/Programmazione/Commenti
** VariabiliPHP/Programmazione/Variabili
** OperatoriPHP/Programmazione/Operatori
** ArrayPHP/Programmazione/Array
** CondizioniPHP/Programmazione/Condizioni
** CicliPHP/Programmazione/Cicli
** Funzioni di basePHP/Programmazione/Funzioni di base
** Funzioni personalizzatePHP/Programmazione/Funzioni personalizzate
** Variabili globaliPHP/Programmazione/Variabili globali
*** $GLOBALSPHP/Programmazione/Variabili globali/$GLOBALS
*** $_GETPHP/Programmazione/Variabili globali/$_GET
*** $_POSTPHP/Programmazione/Variabili globali/$_POST
*** $_SESSIONPHP/Programmazione/Variabili globali/$_SESSION
*** $_COOKIEPHP/Programmazione/Variabili globali/$_COOKIE
*** $_SERVERPHP/Programmazione/Variabili globali/$_SERVER
** FilePHP/Programmazione/File
** ImmaginiPHP/Programmazione/Immagini
** Espressioni regolariPHP/Programmazione/Regexp
** Programmazione orientata agli oggettiPHP/Programmazione/OOP
* Programmazione avanzata con le classi PEARPHP/PEAR
* PHP e i databasePHP/Database
** Funzioni PHP per l'accesso ai database
*** Funzioni MySQLPHP/Programmazione/MySQL
**** Accesso al databasePHP/Programmazione/MySQL/Accesso al database
**** QueryPHP/Programmazione/MySQL/Query
**** Risultati di una queryPHP/Programmazione/MySQL/Risultati di una query
**** Liberare memoria dai risultati di una queryPHP/Programmazione/MySQL/Liberare memoria dai risultati di una query
**** Chiudi connessione al dbPHP/Programmazione/MySQL/Chiudi connessione al db
*** Funzioni PostgreSQLPHP/PostgreSQL
**** Accesso al database
**** Query
**** Risultati di una query
*** Funzioni Sqlite
**** Accesso al database
**** Query
**** Risultati di una query
** Database e object oriented
*** Abstraction Layers
**** PDO - Php Data Objects
**** PEAR::MDB2
**** Creole
*** Object Relational Mapping (ORM)
**** PEAR:DB_DataObject
**** PEAR:DB_Table
**** Propel
* PHP Design PatternPHP/PHP Design Pattern
* SmartyPHP/Smarty
* Sicurezza delle applicazioni web
* PHP CLI: Command Line InterpreterPHP/Cli
* PHP GTK2: applicazioni desktop in PHPPHP/Gtk
* Crediti
Modifica il sommario
Le espressioni regolari consentono complesse elaborazioni testuali.
In questa sede ci limiteremo a illustrare il funzionamento delle regex su PHP senza però spiegare effettivamente come si scrivono le regular expressions (cosa infatti non semplice e di certo impossibile da fare in una pagina).
Per le espressioni regolari sono state scritte varie funzioni, quelle più famose sono la coppia _ereg e il package PCRE (acronimo di "Perl Compatible Regular Expressions" ovvero Regex compatibili con Perl). Le prime tuttavia non hanno le stesse funzionalità avanzate del package PCRE, pertanto analizzeremo queste ultime in particolare (se però si vuole avere una visione anche sulle prime, basta visitare questo link).

## PCRE

Questa libreria è un porting in PHP di un'altra molto utilizzata e diffusa, scritta per Perl. Essa viene anche chiamata colloquialmente preg_match.

### Ottenere dei dati

Vediamo un esempio di come si utilizza una regex in PHP:
Se proviamo a eseguire questo script, otterremo come risultato:
La regex utilizzata serve per trovare tutte le immagini in markup wiki; in particolare restituisce il suo nome reale (ovvero, senza il namespace immagine).
In PHP una regex deve essere definita in una stringa di testo che inizia e finisce con "/" per far capire al motore che quella è una regex e non testo qualunque. La funzione preg_match prende il primo parametro (la regex), lo confronta col secondo (il testo) e assegna il risultato alla variabile indicata come terzo parametro (nel nostro caso $risultato , che noi mostriamo con la funzione print_r).
La variabile di risultato conterrà il testo associato dall'intera regex e l'evenutale testo dei cosiddetti backreference indicati tra le parentesi (nel nostro caso rispettivamente $risultato[0] e $risultato[1]). La prima parentesi non viene restituita come backreference solo perché è stato utilizzato il modificatore ?: che indica al motore delle regex di non contare quelle determinate parentesi per le backreference (ciò serve per rendere la regex più veloce).
Perché, però, non prende anche image:hello? Perché preg_match restituisce solo la prima occorrenza, per ottenerle tutte bisogna usare preg_match_all:
Risultato:
In questo modo abbiamo quindi sia "il pezzo di codice" che volevamo passare al parser sia il risultato nello specifico.
Abbiamo quindi due array annidati dentro un altro, pertanto per accedere al primo basterà usare $risultato[0], mentre $risultato[1] per il secondo. Per accedere invece, per esempio, a Ciao.jpg, basterebbe utilizzare $risultato[1][0].

### Sostituire dei dati con degli altri (replace)

Poniamo per esempio di dover cambiare tutte le stringhe di wikicodice [[Image:x]] con [[Immagine:x]] per ovviare a degli ipotetici problemi tecnici del motore wiki.
Il risultato di questo script è:
In questo modo abbiamo definito una prima regex per ottenere le sottostringhe e poi una seconda per indicare con cosa sostituire il testo associato dalla prima. Dato che la seconda è una stringa e la backslash (\) è un carattere speciale in PHP, bisogna farne l'escape(aggiungendo quindi un'altra backslash) per ottenere un backreference (riferimento all'indietro, ovvero andare a prendere la parentesi identificata dal numero).
Attenzione:
* preg_replace restituisce un valore tramite assegnamento (ovvero, dovete usare la sintassi $variabile = preg_replace;) al contrario di quanto faceva preg_match[_all])
* Questa regex non è la migliore in quanto il tutto potrebbe essere fatto semplicemente sostituendo "/\[\[[Ii]mage:/" con "[[Immagine". La parte superflua è stata tuttavia inserita a esclusiva finalità didattica (per spiegare come usare le backreference correttamente).

### Modificatori

I modificatori servono a modificare il comportamento del motore di regex utilizzato. Per esempio, la regex usata sopra per italianizzare tutte le immagini, diventerebbe:
Con risultato: [[Immagine:ciao.png]], [[Immagine:CIAO.jpeg]]
Come si può vedere, il risultato è identico sebbene l'espressione regolare non sia la stessa (notare in particolare la i dopo l'ultimo slash - / - della regex).

### Particolarità

Le backreference (quelle di solito identificate come \1 o \\1 in php) possono anche essere richiamate con $1 (sostituendo l'1 al numero desiderato) come si fa in Perl.

## Bibliografia

* Apogeo, Espressioni Regolari, Marco Beri.

## Collegamenti esterni

* (EN) www.regular-expressions.info esempi, tutorial e guide sulle regex.
* Guida in italiano a regex di base.