Introduzione
Quando si parla di gestione delle stringhe in PHP, spesso si pensa alle funzioni più comuni come strlen(), strpos() o substr(). Tuttavia, in molti scenari reali queste funzioni non bastano: validare un formato, estrarre parti da un testo, cercare pattern complessi o ripulire input non uniforme richiede uno strumento più potente.
In questo tutorial ci concentriamo su un sotto-argomento molto utile e spesso sottovalutato: le espressioni regolari con PCRE in PHP. Si tratta di una tecnica fondamentale per chi sviluppa applicazioni web, perché permette di analizzare e manipolare stringhe in modo preciso e flessibile.
Vedremo un esempio concreto: validare e normalizzare dati testuali provenienti da un modulo, come email, codici prodotto e numeri di telefono. L’obiettivo non è imparare “tutte” le regex, ma capire come usarle bene in PHP per risolvere problemi reali.
Codice completo
<?php
// Esempio pratico: validazione e normalizzazione di alcuni dati utente
// usando funzioni PCRE in PHP.
$input = [
´nome´ => ´ mario rossi ´,
´email´ => ´[email protected]´,
´telefono´ => ´+39 333-123 4567´,
´codice_prodotto´ => ´PRD-2025-AB12´,
´note´ => "Cliente VIPnRichiede supporto prioritario"
];
// 1) Normalizzazione del nome: spazi multipli ridotti a uno solo
$nomeNormalizzato = preg_replace(´/s+/´, ´ ´, trim($input[´nome´]));
// 2) Validazione email con regex semplice e pratica
$patternEmail = ´/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/´;
if (preg_match($patternEmail, $input[´email´])) {
$emailValida = true;
} else {
$emailValida = false;
}
// 3) Pulizia del numero di telefono: rimuove tutto tranne cifre e simbolo +
$telefonoPulito = preg_replace(´/(?!^+)[^d]/´, ´´, $input[´telefono´]);
// 4) Estrazione di un codice prodotto con formato specifico
// Formato atteso: PRD-YYYY-XXXX dove X sono lettere o numeri
$patternProdotto = ´/^(PRD)-(d{4})-([A-Z0-9]{4})$/´;
if (preg_match($patternProdotto, $input[´codice_prodotto´], $matches)) {
$prefisso = $matches[1];
$anno = $matches[2];
$seriale = $matches[3];
} else {
$prefisso = null;
$anno = null;
$seriale = null;
}
// 5) Verifica presenza di una parola chiave nelle note
if (preg_match(´/bVIPb/´, $input[´note´])) {
$haPriorita = true;
} else {
$haPriorita = false;
}
// 6) Creazione di una versione compatta delle note
$noteCompatte = preg_replace(´/s+/´, ´ ´, trim($input[´note´]));
// Output finale
echo "<h3>Dati elaborati</h3>";
echo "<p>Nome: " . htmlspecialchars($nomeNormalizzato) . "</p>";
echo "<p>Email valida: " . ($emailValida ? ´sì´ : ´no´) . "</p>";
echo "<p>Telefono pulito: " . htmlspecialchars($telefonoPulito) . "</p>";
echo "<p>Codice prodotto: " . htmlspecialchars($input[´codice_prodotto´]) . "</p>";
echo "<p>Prefisso: " . htmlspecialchars((string)$prefisso) . "</p>";
echo "<p>Anno: " . htmlspecialchars((string)$anno) . "</p>";
echo "<p>Seriale: " . htmlspecialchars((string)$seriale) . "</p>";
echo "<p>Priorità: " . ($haPriorita ? ´alta´ : ´normale´) . "</p>";
echo "<p>Note compatte: " . htmlspecialchars($noteCompatte) . "</p>"; Spiegazione
Il cuore di questo esempio è l’uso di tre funzioni principali:
- preg_match(): cerca un pattern all’interno di una stringa e restituisce 1 se trova corrispondenza, 0 altrimenti.
- preg_replace(): sostituisce parti della stringa che corrispondono al pattern.
- preg_match() con array di output: permette anche di catturare gruppi specifici del testo trovato.
1. Normalizzare il nome
Spesso i dati inseriti dagli utenti contengono spazi iniziali, finali o multipli. Con trim() eliminiamo gli spazi ai bordi, mentre con preg_replace(´/s+/´, ´ ´, ...) riduciamo qualsiasi sequenza di spazi, tab o a capo a un singolo spazio.
Questo è molto utile per rendere i dati uniformi prima di salvarli nel database o mostrarli in interfaccia.
2. Validare l’email
La regex usata per l’email è volutamente semplice. Non pretende di coprire ogni caso teorico previsto dallo standard, ma è adatta a un controllo pratico lato applicazione:
- accetta lettere, numeri e alcuni simboli comuni nella parte locale;
- richiede il simbolo @;
- richiede un dominio con estensione di almeno 2 caratteri.
In PHP, per la validazione di email, spesso conviene usare anche filter_var($email, FILTER_VALIDATE_EMAIL). Le regex restano comunque utili quando hai bisogno di regole personalizzate.
3. Pulire il numero di telefono
Il numero di telefono può arrivare con spazi, trattini e altri separatori. La regex /(?!^+)[^d]/ rimuove tutto ciò che non è una cifra, mantenendo però il simbolo + se si trova all’inizio.
Questo è un esempio di come le regex possano essere usate non solo per cercare, ma anche per normalizzare dati in ingresso.
4. Estrarre gruppi da un codice prodotto
La regex /^(PRD)-(d{4})-([A-Z0-9]{4})$/ controlla un formato molto preciso:
- PRD come prefisso fisso;
- d{4} per quattro cifre;
- [A-Z0-9]{4} per quattro caratteri alfanumerici maiuscoli.
Grazie alle parentesi tonde, PHP salva i gruppi catturati nell’array $matches. In questo modo puoi separare facilmente le componenti del codice senza dover fare ulteriori operazioni manuali sulla stringa.
5. Cercare una parola chiave esatta
La regex /bVIPb/ usa b, che indica un confine di parola. Questo evita falsi positivi: ad esempio, non troverà “VIP” dentro una parola più lunga come “VIPSpecial”.
È una tecnica utile quando vuoi cercare termini precisi in descrizioni, note, commenti o contenuti editoriali.
Best practice
- Usa regex quando servono pattern complessi, non per operazioni semplici che si possono risolvere con funzioni base.
- Commenta sempre le espressioni regolari più importanti: una regex non documentata diventa difficile da mantenere.
- Evita pattern troppo permissivi se stai validando dati critici come email, codici o identificativi.
- Testa i casi limite: stringhe vuote, spazi extra, caratteri speciali, formati incompleti.
- Preferisci la leggibilità alla “furbizia”: una regex chiara e leggermente più lunga è meglio di una molto compatta ma incomprensibile.
- Usa htmlspecialchars() quando stampi dati derivati da input utente, per evitare problemi di sicurezza lato output HTML.
- Per la validazione standard, valuta prima le funzioni native PHP come filter_var() e usa le regex per regole specifiche.
Riepilogo
Le espressioni regolari sono uno strumento potente per la gestione delle stringhe in PHP. Ti permettono di:
- validare formati testuali;
- estrarre informazioni da stringhe strutturate;
- ripulire dati sporchi o incoerenti;
- cercare pattern specifici con precisione.
Nel tutorial abbiamo visto un caso d’uso concreto: normalizzazione del nome, validazione email, pulizia del telefono, parsing di un codice prodotto e ricerca di parole chiave nelle note. Sono operazioni tipiche di applicazioni reali, dove le stringhe arrivano quasi sempre in formati imperfetti.
Se impari a usare bene preg_match() e preg_replace(), avrai un vantaggio enorme nella gestione di input, log, contenuti editoriali e dati provenienti da API o form.
Approfondisci con risorse ufficiali
- Manuale PHP - PCRE: documentazione ufficiale sulle espressioni regolari supportate da PHP.
- preg_match(): per cercare corrispondenze e catturare gruppi.
- preg_replace(): per sostituire parti di stringa in base a un pattern.
- preg_split(): utile quando vuoi dividere una stringa usando un pattern.
- filter_var(): per validazioni standard, ad esempio email e URL.
Se vuoi, posso anche scrivere un secondo tutorial dedicato a preg_split() e all’uso delle espressioni regolari per dividere testi complessi in PHP.
