Espressioni regolari con le funzioni PCRE (e differenze con le funzioni POSIX)
Pagina 1 di 4
Ne avevamo già accennato nei giorni scorsi attraverso le pagine del nostro blog, ma oggi desidero approfondire un argomento che, credo, sia di interesse per migliaia di sviluppatori che - come me - utilizzano quotidianamente il PHP per sviluppare le proprie web applications.
A partire dalla versione 5.3 di PHP, infatti, gli sviluppatori che desiderano avvalersi delle potenzialità delle espressioni regolari non potranno più fare ricorso alle funzioni POSIX (per intenderci ereg() e famiglia) ma dovranno, necessariamente, utilizzare le funzioni PCRE (Perl Compatible Regular Expressions) come, ad esempio, preg_match().
Le funzioni PCRE integrate in PHP consentono di utilizzare la sintassi delle espressioni regolari tipica del Perl (più precisamente l'implementazione attuale offre supporto alla sintassi di Perl 5.005) che si presenta leggermente diversa rispetto a quella delle funzioni POSIX. Per maggiori informazioni sulla sintassi delle PCRE è possibile consultare il manuale disponibile sul sito ufficiale PCRE.org.
Effettuare confronti: la funzione preg_match()
Qualora si desideri effettuare un confronto tra una stringa ed un pattern (un modello scritto sotto forma di regular expression) sarà necessario ricorrere alla funzione preg_match() che, di fatto, sostituisce ereg() ed eregi().
L'utilizzo di preg_match() è, nell'uso comune, piuttosto semplice: si passa alla funzione il pattern e la stringa di verificare. Se il pattern è soddisfatto la funzione restituisce 1 in caso contrario 0 (oppure FALSE se c'è un errore).
In realtà migrare da ereg() non è cosa complicata. Sarà sufficiente qualche piccolo accorgimento nella formulazione del pattern.
Vediamo un esempio:
<?php
if (preg_match('/mrwebmaster/i','Evviva MrWebmaster!')) {
echo "Trovato";
}else{
echo "NON trovato";
}
?>
Il che è identico a:
<?php
if (eregi('mrwebmaster','Evviva MrWebmaster!')) {
echo "Trovato";
}else{
echo "NON trovato";
}
?>
Nel nostro semplice esempio di utilizzo di preg_match() abbiamo usato come pattern la stringa
/mrwebmaster/iVediamo la sintassi:
- / ... / - delimitano l'inizio e la fine dell'espressione;
- mrwebmaster - è una semplice stringa della quale si vuole verificare la presenza nel testo passato come secondo argomento;
- i - la "i" dopo il delimitatore di chiusura indica che la ricerca deve essere NON case-sensitive (esattamente come avveniva utilizzando la funzione eregi()). Tecnicamente questa "i" è un modificatore; a questa pagina l'elenco completo dei modificatori ammessi nella sintassi delle PCRE.
Le differenze con ereg()
Come potete vedere le differenze con ereg() non sono moltissime; vediamo di riassumerle brevemente:
- uso dei delimitatori / ... / (in realtà è possibile utilizzare come delimitatore anche altri caratteri, ma le slash sono la scelta più consueta);
- la versione case-insensitive (eregi()) è sostituita dall'uso di "i" dopo il delimitatore di chiusura;
- l'eventuale presenza del carattere / nel pattern necessiterà (qualora si siano utilizzate le slash come delimitatori) di escape (\/) al fine di non essere confuso coi delimitatori;
- ci sono alcune marginali differenze nella gestione dei caratteri ASCII (le funzioni POSIX, a differenza delle PCRE, accettano la rappresentazione numerica dei caratteri ASCII: ad es. il numero 10 corrisponde a new line e 13 a carriage return; vicevera con le funzioni PCRE il 10 rappresenta solo ed esclusivamente il numero dieci).
- la funzione ereg() ammette tre soli parametri (pattern, testo da verificare e, facoltativamente, array per contenere i risultati) mentre preg_match() ne ammette cinque (i primi due, che abbiamo già visto, sono obbligatori, gli altri tre sono facoltativi);
Sulla base di quanto detto (e delle differenze di cui si è accennato) possiamo considerare ancora (parzialmente) valide le spiegazioni teoriche riguardanti la sintassi delle espressioni regolari reperibili a questa pagina dell'articolo "Le espressioni regolari in PHP" dedicato alle vecchie funzioni POSIX.







