Il modo più semplice e sicuro per verificare se un indirizzo e-mail è ben formato è utilizzare la filter_var()
funzione:
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
// invalid emailaddress
}
Inoltre puoi verificare se il dominio definisce un MX
record:
if (!checkdnsrr($domain, 'MX')) {
// domain is not valid
}
Ma ciò non garantisce ancora l'esistenza della posta. L'unico modo per scoprirlo è inviare una mail di conferma.
Ora che hai la tua risposta facile sentiti libero di leggere sulla convalida dell'indirizzo e-mail se ti interessa imparare o utilizzare semplicemente la risposta veloce e andare avanti. Senza rancore.
Cercare di convalidare un indirizzo e-mail usando regex è un'attività "impossibile". Direi che quella regex che hai creato è inutile. Ci sono tre RFC per quanto riguarda gli indirizzi e-mail e la scrittura di una regex per catturare indirizzi e-mail sbagliati e allo stesso tempo non avere falsi positivi è qualcosa che nessun mortale può fare. Dai un'occhiata a questo elenco per i test (sia falliti che riusciti) del regex usato dalla filter_var()
funzione di PHP .
Anche le funzioni PHP integrate, i client e i server di posta elettronica non funzionano correttamente. Ancora nella maggior parte dei casi filter_var
è l'opzione migliore.
Se vuoi sapere quale modello regex PHP (attualmente) utilizza per convalidare gli indirizzi e-mail, vedi la fonte PHP .
Se vuoi saperne di più sugli indirizzi e-mail ti consiglio di iniziare a leggere le specifiche, ma devo avvisarti che non è una lettura facile da nessuna parte:
Nota che filter_var()
è già stato dichiarato disponibile solo a partire da PHP 5.2. Se vuoi che funzioni con le versioni precedenti di PHP puoi usare il regex usato in PHP:
<?php
$pattern = '/^(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){255,})(?!(?:(?:\\x22?\\x5C[\\x00-\\x7E]\\x22?)|(?:\\x22?[^\\x5C\\x22]\\x22?)){65,}@)(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22))(?:\\.(?:(?:[\\x21\\x23-\\x27\\x2A\\x2B\\x2D\\x2F-\\x39\\x3D\\x3F\\x5E-\\x7E]+)|(?:\\x22(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]|(?:\\x5C[\\x00-\\x7F]))*\\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-+[a-z0-9]+)*\\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-+[a-z0-9]+)*)|(?:\\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\\]))$/iD';
$emailaddress = 'test@gmail.com';
if (preg_match($pattern, $emailaddress) === 1) {
// emailaddress is valid
}
PS Una nota sul modello regex usato sopra (dalla fonte PHP). Sembra che ci sia un po 'di copyright su di esso di Michael Rushton . Come indicato: "Sentiti libero di usare e ridistribuire questo codice. Ti preghiamo di tenere presente questa nota sul copyright."
validateEmail
sarebbe corret, oltre che passare$email
, no$EMAIL
.