W3docs

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:

php— editable, runs on the server

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):

php— editable, runs on the server

Nota: Preferisci FILTER_VALIDATE_EMAIL a 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://.

php— editable, runs on the server

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:

php— editable, runs on the server

Nota: Sia per le email che per gli URL, i filtri integrati di filter_var sono 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.

  • Usa filter_var($value, FILTER_VALIDATE_EMAIL) e filter_var($value, FILTER_VALIDATE_URL) per una validazione affidabile e leggibile.
  • FILTER_VALIDATE_URL richiede uno schema come https://; aggiungi flag come FILTER_FLAG_PATH_REQUIRED per 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.

Pratica

Pratica
Quali delle seguenti affermazioni su moduli PHP, URL e indirizzi email sono corrette?
Quali delle seguenti affermazioni su moduli PHP, URL e indirizzi email sono corrette?
Was this page helpful?