Espressioni regolari e pattern
Un'espressione regolare è una stringa, definita pattern, che contiene al suo interno una serie di simboli attraverso i quali è possibile identificare gruppi di stringhe.
Proviamo a semplificare la definizione attraverso un esempio. Supponiamo di avere la necessità di verificare che una stringa contenga al suo interno uno username valido per la nostra applicazione, quali sono i controlli da effettuare? Probabilmente almeno i seguenti:
- la stringa contiene caratteri alfabetici minuscoli e numeri;
- la stringa può contenere anche i simboli "_" e "-";
- la stringa deve essere di lunghezza compresa tra 3 e 15 caratteri.
Effettuare tutte queste verifiche senza le espressioni regolari (o regex
/^[a-z0-9_-]{3,15}$/
Ad un primo sguardo questa serie di caratteri può sembrare incomprensibile ma andiamo a scomporla ed analizzarla.
- Innanzitutto in PHP un qualsiasi pattern deve iniziare e terminare con il carattere
/
- Il simbolo
^
match [a-z0-9_-]
a
z
0
9
_
-
{3,15}
- Il simbolo
$
Validazione delle stringhe con le regex
Ora che abbiamo analizzato alcune delle regole di un'espressione regolare probabilmente ci stiamo chiedendo come fare con PHP a verificare che la stringa sia valida o meno. Per determinarlo possiamo usare la funzione preg_match()
. Tale funzione prende in ingresso principalmente tre parametri:
- il
$pattern
- il
$subject
$matches
L'esempio diventerà quindi:
$username = 'dymissy86';
if (!preg_match('/^[a-z0-9_-]{3,15}$/', $username)) {
echo "Lo username non è valido";
} else {
echo "Username valido";
}
Dato che lo username passato come parametro è formalmente valido, verrà stampato un messaggio di successo. Se invece $username
Dymissy86
Sintassi PCRE
Le regole delle espressioni regolari appartengono alla famiglia PCRE (Perl Compatible Regular Expressions). Vediamo insieme quali sono i meta caratteri che definiscono la sintassi delle regex.
Meta carattere | Descrizione |
---|---|
\ | Carattere generico di escape |
^ | Delimitatore di inizio della stringa |
$ | Delimitatore di fine della stringa |
. | Definisce ogni carattere eccetto il carattere di invio |
[ | Carattere di inizio della definizione di classe |
] | Carattere di fine della definizione di classe |
| | Inizio di un ramo alternativo |
( | Inizio subpattern |
) | Fine subpattern |
? | Indica 0 o 1 occorrenze |
* | 0 o più occorrenze |
+ | 1 o più occorrenze |
{ | Inizio intervallo minimo/massimo di occorrenze |
} | Fine intervallo minimo/massimo di occorrenze |
- | Indica un range di caratteri all'interno di parentesi [] |
. | Indica un singolo carattere |
\s | Un carattere di spaziatura (space, tab, newline) |
\S | Tutto eccetto un carattere di spaziatura |
\d | Un carattere numerico (0-9) |
\D | Tutto eccetto un carattere numerico |
\w | Una lettera (a-z, A-Z, 0-9, _) |
\W | Tutto eccetto una lettera |
[aeiou] | Uno dei caratteri compresi nella parentesi |
[^aeiou] | Tutto eccetto i caratteri compresi nella parentesi |
(foo|bar|baz) | Una delle alternative tra parentesi |
Una volta definiti e compresi i meta caratteri possiamo iniziare a lavorare con le espressioni regolari. Nella prossima lezione vedremo insieme altri esempi di regex e quali sono le funzioni più importanti messe a disposizione da PHP.