2010-08-31 6 views
25

Per PHP qual è la migliore convalida e-mail utilizzando preg, NONereg perché è deprecati/rimosso.PHP convalida email

ho non ho bisogno di controllare se il sito esiste (non è come la massima sicurezza).

Ho trovato molti modi con ereg ma loro (ovviamente) non sono una buona pratica.

risposta

78

vi suggerisco di utilizzare il filtro FILTER_VALIDATE_EMAIL:

if (filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    //valid 
} 

È inoltre possibile utilizzare its regular expression direttamente:

"/^(?!(?:(?:\\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" 

Ma in tal caso, se un bug è trovato nell'espressione regolare, è' Dovrò aggiornare il tuo programma invece di aggiornare semplicemente PHP.

+1

Tenete a mente che una e-mail può anche contenere questi caratteri: ' '/ *'. Quindi questa convalida non rende DB sicuro. –

+0

filter_var() è nuovo per me. FILTER_VALIDATE_EMAIL è buono? – Marwelln

+0

+1 per il riferimento al codice sorgente. ottimo –

3

A meno che non si desideri utilizzare uno very very long regular expressions, verrà eseguito un indirizzo email valido non coperto (si pensi al Unicode). Anche gli indirizzi e-mail falsi passeranno come validi, quindi qual è il punto di convalida se puoi semplicemente scrivere [email protected] e farla franca?

Il modo migliore per convalidare gli indirizzi di posta elettronica è inviare un'e-mail di conferma con un collegamento per fare clic. Funzionerà solo se l'indirizzo email è valido: facile e non è necessario utilizzare espressioni regolari.

+0

semplicemente come ho detto, non è come la massima sicurezza –

+4

Uno sviluppatore ragionevole controllerà sempre un dato indirizzo per la validità PRIMA di tentare di inviare una e-mail alla "stringa". Quindi questo non è un argomento. Ma Doupble opt-in dovrebbe essere fatto comunque - non era questa la domanda. –

+0

@ Jan .: Quindi, cosa succede se la mia email è àèìòù@mydomain.com e il tuo controllo preventivo mi impedisce di registrarti al tuo sito? Basta inviare una e-mail di conferma e si è impostato, non è necessario verificare la validità prima e rischiare di bloccare gli indirizzi email validi. – nico

0
function check_email($check) { 
$expression = "/^[a-zA-Z0-9._-][email protected][a-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/"; 
if (preg_match($expression, $check)) { 
    return true; 
} else { 
    return false; 
} 
} 

chiamano in se() come condizione di seguito Esempio:

if(!check_email($_REQUEST['ContactEmail'])){ 
    $register_error ="Enter the correct email address!<br />"; 
    $reg_error=1; 
} 
+0

qualcuno può dirmi qual è il problema in questo codice bcz una persona in fondo al voto. Funziona bene. –

+0

Non sono stato io a votare, ma .... non è corretto filtrare correttamente gli indirizzi e-mail, la regex corretta e completa si trova qui: http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html In secondo luogo l'utilizzo del PHP integrato in FILTER_VALIDATE_EMAIL sarebbe il modo corretto/migliore per filtrare un indirizzo e-mail – twigg