Espressioni Regolari PHP
Scopri come usare le espressioni regolari in PHP per validare input, cercare testo ed estrarre dati con le funzioni preg_.
Un'espressione regolare (regex) è un pattern che descrive un insieme di stringhe. In PHP, le espressioni regolari permettono di cercare testo, validare input, estrarre dati e trasformare stringhe con molto meno codice rispetto alla logica manuale carattere per carattere. Questo capitolo tratta la sintassi, le funzioni preg_ e le tecniche avanzate più utili, con esempi eseguibili per ciascuna.
Cosa sono le Espressioni Regolari
Un'espressione regolare è una sequenza di caratteri che definisce un pattern di ricerca. Invece di corrispondere a una stringa fissa, un pattern può descrivere un'intera famiglia di stringhe — "qualsiasi cifra", "una o più lettere", "una stringa a forma di email", e così via. Questo rende le regex ideali per:
- Validare l'input dell'utente (email, numeri di telefono, codici postali).
- Cercare sottostringhe che seguono una forma piuttosto che un valore esatto.
- Estrarre dati — recuperare numeri d'ordine, date o URL da testo libero.
- Sostituire e dividere testo in base a un pattern.
PHP usa PCRE (Perl-Compatible Regular Expressions), quindi la sintassi del pattern è la stessa di Perl, JavaScript e della maggior parte degli altri linguaggi moderni.
Come Funzionano le Espressioni Regolari in PHP
In PHP, le espressioni regolari sono gestite dalla famiglia di funzioni preg_. Ognuna accetta un pattern come primo argomento ed esegue un'operazione diversa.
Funzioni preg_ comuni
| Funzione | Descrizione |
|---|---|
preg_match() | Cerca la prima corrispondenza. Restituisce 1 in caso di corrispondenza, 0 in assenza di corrispondenza, false in caso di errore |
preg_match_all() | Trova tutte le corrispondenze. Restituisce il numero di corrispondenze complete trovate |
preg_replace() | Sostituisce ogni corrispondenza con una stringa di sostituzione |
preg_split() | Divide una stringa in un array usando il pattern come delimitatore |
preg_quote() | Effettua l'escape dei caratteri con significato speciale in un pattern |
Un errore comune: preg_match() restituisce 0 (falsy) per nessuna corrispondenza e false per un errore (come un pattern malformato). Usa l'operatore === quando devi distinguere questi due casi.
Le Basi delle Espressioni Regolari PHP
Un pattern PHP è una stringa con il corpo del pattern racchiuso tra delimitatori (comunemente /), seguito opzionalmente da modificatori:
Sintassi delle espressioni regolari PHP
/pattern/modifiersDove pattern è la sequenza di caratteri da abbinare, e modifiers sono lettere opzionali che modificano il comportamento del pattern. I modificatori più comunemente usati in PHP sono:
i: Corrispondenza senza distinzione tra maiuscole e minuscole (/php/icorrisponde aPHP,Php,php).m: Modalità multilinea —^e$corrispondono all'inizio/fine di ogni riga, non solo dell'intera stringa.s: Modalità "dotall" —.corrisponde anche ai caratteri di nuova riga.u: Tratta il pattern e il soggetto come UTF-8. Usalo ogni volta che il testo può contenere caratteri non ASCII.
Elementi fondamentali comuni dei pattern
All'interno del pattern stesso, una manciata di metacaratteri svolge la maggior parte del lavoro:
| Token | Significato |
|---|---|
\d \w \s | Una cifra, un carattere parola, un carattere spazio |
. | Qualsiasi singolo carattere (eccetto nuova riga, a meno che non sia impostato s) |
+ * ? | Uno-o-più, zero-o-più, zero-o-uno del token precedente |
{2,4} | Tra 2 e 4 ripetizioni |
^ $ | Inizio e fine della stringa (o riga in modalità m) |
[abc] | Una classe di caratteri — uno qualsiasi tra a, b, o c |
(...) | Un gruppo di cattura |
| | Alternanza — corrisponde al pattern su entrambi i lati |
Espressione regolare PHP per sostituire testo
Usare le Espressioni Regolari PHP per Validare l'Input dell'Utente
Uno degli usi più comuni delle espressioni regolari in PHP è la validazione dell'input dell'utente. Ad esempio, puoi usare un'espressione regolare per assicurarti che un indirizzo email inserito dall'utente sia nel formato corretto. Il seguente codice mostra come farlo:
Espressione regolare PHP per verificare che un indirizzo email inserito dall'utente sia nel formato corretto
Nota: Sebbene questa regex funzioni per la validazione di base, PHP fornisce la funzione integrata filter_var($email, FILTER_VALIDATE_EMAIL) per una validazione email più robusta e conforme all'RFC. Per i flussi di lavoro completi dei moduli, consulta PHP Form Validation.
Trovare Tutte le Corrispondenze
Mentre preg_match() si ferma alla prima corrispondenza, preg_match_all() raccoglie ogni corrispondenza in un array. Questo è lo strumento per estrarre dati ripetuti, come ogni parola, numero o tag in una stringa.
Estrarre ogni numero da una stringa
<?php
$text = "Room 12, floor 3, building 7";
$count = preg_match_all("/\d+/", $text, $matches);
echo $count; // Outputs: 3
print_r($matches[0]); // Outputs: Array ( [0] => 12 [1] => 3 [2] => 7 )
?>Dividere le Stringhe
preg_split() suddivide una stringa in un array usando un pattern come delimitatore. A differenza di explode(), il delimitatore può variare — qui dividiamo su qualsiasi sequenza di virgole e spazi:
<?php
$csv = "apple, banana, cherry";
$fruits = preg_split("/[\s,]+/", $csv);
print_r($fruits);
// Outputs: Array ( [0] => apple [1] => banana [2] => cherry )
?>Tecniche Avanzate per le Espressioni Regolari PHP
Una volta che le basi sono ben assimilate, queste tecniche ti permettono di scrivere pattern espressivi e precisi.
Gruppi di cattura
Le parentesi (...) catturano parte di una corrispondenza in modo da poterla leggere dall'array $matches. L'indice 0 contiene l'intera corrispondenza; l'indice 1 e successivi contengono ciascun gruppo.
Gruppi con nome
(?<name>...) assegna a un gruppo un'etichetta leggibile, così puoi estrarre i valori per nome invece che per indice numerico — molto più chiaro per date, prezzi e altri dati strutturati.
<?php
$date = "2023-10-01";
preg_match("/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/", $date, $m);
echo $m["year"]; // Outputs: 2023
echo $m["month"]; // Outputs: 10
?>Alternanza
L'operatore | corrisponde a un pattern o a un altro. L'esempio seguente corrisponde all'animale che appare per primo:
<?php
preg_match("/cat|dog|bird/", "I love cats", $m);
echo $m[0]; // Outputs: cat
?>Altri elementi fondamentali
- Gruppi non di cattura —
(?:...)raggruppano i token insieme (ad esempio, per applicare un quantificatore) senza memorizzare la corrispondenza, il che mantiene pulito l'array$matches. - Lookahead / lookbehind —
(?=...),(?!...),(?<=...),(?<!...)effettuano la corrispondenza in base a ciò che viene prima o dopo una posizione senza consumarla. - Quantificatori —
{n},{n,}, e{n,m}corrispondono a un conteggio esatto o a un intervallo di ripetizioni, ad es.\d{4}per esattamente quattro cifre.
Quando hai bisogno di abbinare testo fornito dall'utente letteralmente all'interno di un pattern, eseguilo attraverso preg_quote() prima, in modo che caratteri come . o * vengano sottoposti a escape invece di essere trattati come metacaratteri.
Argomenti Correlati
- PHP RegEx (guida completa) — un approfondimento della sintassi PCRE in PHP.
- PHP Strings — le funzioni per stringhe non regex che le regex complementano.
- PHP Form Validation — applicare i pattern all'input reale dei moduli.
Conclusione
Le espressioni regolari PHP sono uno strumento potente che può aiutarti a svolgere un'ampia gamma di attività. Che tu stia validando l'input dell'utente, cercando nel testo o eseguendo manipolazioni complesse di stringhe, le espressioni regolari sono una parte essenziale del toolkit dello sviluppatore PHP.