Validazione dei moduli PHP: URL e indirizzi email
Impara a validare email e URL nei moduli PHP con filter_var e le espressioni regolari per garantire dati corretti prima di elaborarli.
Email e URL sono due dei campi più comuni in qualsiasi modulo web, e sono anche due di quelli che gli utenti sbagliano più facilmente. Un errore di battitura come user@example (dominio di primo livello mancante) o example.com (un URL senza schema) supera un controllo superficiale "il campo è vuoto?" ma causa problemi nel momento in cui l'applicazione tenta di inviare un messaggio o seguire il link.
Questo capitolo mostra come validare gli input di email e URL in PHP — verificando che un valore abbia la forma attesa prima di memorizzarlo o utilizzarlo. La validazione è un passaggio all'interno di un flusso più ampio che comprende anche la raccolta dei dati da $_POST/$_GET, la loro pulizia e la sanitizzazione; per il quadro completo consulta Gestione dei moduli PHP e Validazione dei moduli PHP.
Vengono trattati due approcci: la funzione integrata filter_var (consigliata) e le espressioni regolari (utili da conoscere, occasionalmente necessarie per regole personalizzate).
Validazione degli input email
Il modo più semplice per validare un indirizzo email in PHP è la funzione filter_var con il filtro FILTER_VALIDATE_EMAIL. Restituisce il valore filtrato se la stringa ha l'aspetto di un'email valida, e false in caso contrario — quindi si abbina naturalmente a un controllo if:
Poiché filter_var restituisce false (non null) per input non valido, confronta sempre usando il negatore ! oppure lo stretto === false. Un errore comune è scrivere if (filter_var($email, FILTER_VALIDATE_EMAIL) == false) per un indirizzo come 0, che in questo caso va bene, ma in generale è preferibile usare === false per evitare le sorprese dovute ai confronti deboli di PHP.
Validazione dell'email con un'espressione regolare
È possibile validare un'email anche con un'espressione regolare — un pattern che descrive quali stringhe sono ammesse — usando preg_match. Vale la pena conoscerla, ma usala solo quando hai bisogno di una regola che filter_var non riesce a esprimere (ad esempio, limitare gli indirizzi a un singolo dominio aziendale):
Nota: Preferisci
FILTER_VALIDATE_EMAILa una regex scritta a mano in produzione. La specifica completa delle email (RFC 5322) è notoriamente difficile da catturare con un singolo pattern, e la regex sopra rifiuterà indirizzi perfettamente validi come domini di primo livello lunghi (.museum) o indirizzi con tag+([email protected]). Consulta Espressioni regolari PHP per approfondire la sintassi dei pattern.
Validazione degli input URL
Gli URL si validano allo stesso modo, con filter_var e il filtro FILTER_VALIDATE_URL. Un dettaglio importante: il filtro richiede uno schema (http://, https://, ftp://, …). Un semplice example.com o www.example.com viene segnalato come non valido, quindi decidi in anticipo se il tuo modulo si aspetta che gli utenti digitino il prefisso https://.
FILTER_VALIDATE_URL accetta flag aggiuntivi per rendere la regola più restrittiva — ad esempio, FILTER_FLAG_PATH_REQUIRED (l'URL deve contenere un percorso dopo l'host) o FILTER_FLAG_QUERY_REQUIRED (deve contenere una query string):
<?php
$url = "https://example.com/page?ref=newsletter";
if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED)) {
echo "Valid URL with a query string";
} else {
echo "Missing or invalid query string";
}
?>Validazione dell'URL con un'espressione regolare
Come per le email, è possibile abbinare un URL con un'espressione regolare. Il pattern seguente è permissivo e va considerato più come supporto didattico che come regola da usare in produzione:
Nota: Sia per le email che per gli URL, i filtri integrati di
filter_varsono la scelta raccomandata. Vengono mantenuti insieme a PHP, coprono i casi limite che le regex non gestiscono, e risultano molto più leggibili nel codice.
Tutto insieme in un modulo
In un modulo reale non si lavora con stringhe hard-coded — si leggono i valori inviati dal superglobale $_POST, li si pulisce con trim e si raccolgono gli errori per mostrarli tutti in una volta sola. Questo esempio valida un'email obbligatoria e un sito web facoltativo:
<?php
// Imagine these come from a submitted <form method="post">.
$email = trim($_POST["email"] ?? "");
$website = trim($_POST["website"] ?? "");
$errors = [];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = "Please enter a valid email address.";
}
// Website is optional: only validate it when something was typed.
if ($website !== "" && !filter_var($website, FILTER_VALIDATE_URL)) {
$errors[] = "Please enter a valid URL.";
}
if (empty($errors)) {
echo "All inputs are valid.";
} else {
echo implode("\n", $errors);
}
?>L'operatore di coalescenza null ?? "" evita un avviso quando il campo è assente, e il controllo $website !== "" rende l'URL facoltativo. Questo è lo stesso pattern usato in Campi obbligatori nei moduli PHP.
Validazione vs. sanitizzazione
La validazione risponde alla domanda "questo valore ha la forma giusta?" — non rimuove né fa l'escape di caratteri pericolosi. Questo è compito della sanitizzazione. PHP espone filtri di sanitizzazione come FILTER_SANITIZE_EMAIL, che rimuove i caratteri non consentiti in un indirizzo email:
<?php
$raw = "user(at)example.com";
$clean = filter_var($raw, FILTER_SANITIZE_EMAIL); // "useratexample.com"
if (filter_var($clean, FILTER_VALIDATE_EMAIL)) {
echo "Usable email: $clean";
} else {
echo "Could not produce a valid email";
}
?>In questo caso la sanitizzazione trasforma user(at)example.com in useratexample.com, che poi non supera la validazione — esattamente il risultato corretto, poiché l'originale non era un vero indirizzo. Come regola generale: valida per accettare o rifiutare, sanitizza prima dell'output, e non fidarti mai dell'input proveniente da un modulo. Per l'escape dei dati destinati a HTML o a un database, consulta htmlspecialchars e mysqli::real_escape_string.
Riepilogo
- Usa
filter_var($value, FILTER_VALIDATE_EMAIL)efilter_var($value, FILTER_VALIDATE_URL)per una validazione affidabile e leggibile. FILTER_VALIDATE_URLrichiede uno schema comehttps://; aggiungi flag comeFILTER_FLAG_PATH_REQUIREDper rendere la regola più restrittiva.- Le espressioni regolari possono validare questi formati, ma sono facilmente soggette a errori — preferisci i filtri integrati.
- Validazione e sanitizzazione svolgono compiti diversi; usale entrambe e tratta tutti i dati inviati come non attendibili.