2010-08-31 8 views
25

Pour PHP quelle est la meilleure validation électronique à l'aide preg, PASereg parce qu'il est dépréciée/enlevé.validation email PHP

Je ne besoin de vérifier si le site existe (il est pas comme une sécurité maximale).

J'ai trouvé plusieurs façons avec ereg mais ils (évidemment) ne sont pas une bonne pratique.

Répondre

78

Je vous suggère d'utiliser le filtre FILTER_VALIDATE_EMAIL:

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

Vous pouvez également utiliser its regular expression directement:

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

Mais dans ce cas, si un bogue se trouve dans l'expression régulière, vous Je vais devoir mettre à jour votre programme au lieu de simplement mettre à jour PHP.

+1

Gardez à l'esprit qu'un email peut aussi contenir ces caractères: ' '/ *'. Cette validation ne rend donc pas la base de données sûre. –

+0

filter_var() est nouveau pour moi. FILTER_VALIDATE_EMAIL est-il bon? – Marwelln

+0

+1 pour la référence du code source. great –

3

À moins que vous ne souhaitiez utiliser un very very long regular expressions, vous rencontrerez des adresses électroniques valides qui ne sont pas couvertes (pensez à Unicode). De fausses adresses e-mail seront aussi valables, alors à quoi bon valider si vous pouvez simplement écrire [email protected] et vous en sortir? La meilleure façon de valider les adresses e-mail consiste à envoyer un e-mail de confirmation avec un lien à cliquer. Cela ne fonctionnera que si l'adresse email est valide: facile, et pas besoin d'utiliser regex.

+0

simplement comme je l'ai dit, ce n'est pas comme sécurité maximale –

+4

Un développeur raisonnable vérifiera toujours une adresse donnée pour la validité AVANT d'essayer d'envoyer un courriel à la "chaîne". Donc, ce n'est pas un argument. Mais Doupble-opt-in devrait être fait de toute façon - ce qui n'était pas la question. –

+0

@Jan .: Alors, que se passe-t-il si mon email est àèìòù@mydomain.com et que votre chèque préemptif m'empêche de m'inscrire sur votre site? Il suffit d'envoyer un e-mail de confirmation et vous êtes prêt, vous n'avez pas besoin de vérifier la validité avant et risquer de bloquer les adresses e-mail valides. – 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; 
} 
} 

Appelez-le si() condition exemple ci-dessous:

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

quelqu'un peut-il me dire quel est le problème dans ce code bcz une personne sur le vote. Ça fonctionne bien. –

+0

Ce n'est pas moi qui ai voté mais ... ce n'est pas correct de filtrer correctement les adresses e-mail, l'exacte et complète regex peut être trouvée ici: http://www.ex-parrot.com/~ pdw/Mail-RFC822-Address.html Deuxièmement en utilisant le PHP intégré dans FILTER_VALIDATE_EMAIL serait le moyen correct/meilleur de filtrer une adresse e-mail – twigg