web-dev-qa-db-fra.com

Vérifier si une chaîne est une adresse email dans PHP

J'essaie de faire une requête SQL, mais je dois vérifier si la valeur est une adresse électronique ..__ J'ai besoin d'un moyen de vérifier si $user est une adresse électronique, car j'ai des valeurs d'utilisateur telles que celle-ci dans mon tableau .

test
test2
[email protected]
[email protected]
test392
[email protected]

etc...

Je dois faire en sorte que $useremail vérifie $user pour savoir s'il s'agit d'une adresse électronique. Je peux donc METTRE À JOUR les valeurs, WHERE user=test OR [email protected], etc.

$user = strtolower($olduser);
$useremail = "";

mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail");
47
Homework

Ce n'est pas une bonne méthode et ne vérifie pas si l'e-mail existe mais vérifie s'il ressemble à un e-mail avec l'extension @ et domain.

function checkEmail($email) {
   $find1 = strpos($email, '@');
   $find2 = strpos($email, '.');
   return ($find1 !== false && $find2 !== false && $find2 > $find1 ? true : false);
}

$email = '[email protected]';
$check = checkEmail($email);
if ( $check ) {
   echo $email . ' looks like a valid email.';
}
6
Jake

Sans expressions régulières:

<?php
    if(filter_var("[email protected]", FILTER_VALIDATE_EMAIL)) {
        // valid address
    }
    else {
        // invalid address
    }
?>
182
Uri

La méthode la plus simple consiste à utiliser une expression régulière pour vérifier les adresses e-mail, même s’il existe un désaccord sur son exactitude. Ce processus est discuté en détail ici:

Utiliser une expression régulière pour valider une adresse email

Vous pouvez utiliser REGEXP dans MySQL pour sélectionner dans la base de données en fonction de votre expression régulière:

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

8
Travis

Vous pouvez utiliser des expressions régulières pour valider votre chaîne de saisie afin de déterminer si elle correspond à une adresse électronique:

<?php 
$email = "[email protected]"; 
if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 
  echo "Valid email address."; 
} 
else { 
  echo "Invalid email address."; 
} 
?>

De: http://www.totallyphp.co.uk/code/validate_an_email_address_using_regular_expressions.htm

EDIT: pour des expressions plus précises, reportez-vous à Travis answer sur cette question

5
Rubens Farias

Cette fonction is_email () vous donnera une réponse précise quant à savoir si la chaîne est une adresse électronique valide ou non. Autant que je sache, aucune autre solution ne le fera avec le même niveau d'autorité.

Si je comprends bien l'exemple, vous l'utiliseriez comme ceci

$user = strtolower($olduser);
$useremail = (is_email($user)) ? $user : '';

La fonction intégrée PHP est incomplète. Je suis l'auteur principal de is_email(), alors je sonne ici comme une trompette, mais j'y ai consacré beaucoup de travail pour que personne d'autre ne soit obligé de le revoir.

4
Dominic Sayers

J'utilise cette fonction depuis de nombreuses années sur des centaines de sites. Ce n'est probablement pas parfait, mais je n'ai jamais eu à me plaindre de faux négatifs (ou de positifs):

function validate_email($email) {
    return (preg_match("/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/", $email) || !preg_match("/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email)) ? false : true;
}
3
Rob
if(filter_var($email, FILTER_VALIDATE_EMAIL))
{
    echo 'This is a valid email address.';
    echo filter_var($email, FILTER_VALIDATE_EMAIL);
    //exit("E-mail is not valid");
}
else
{
    echo 'Invalid email address.';
} 
3
Ben

En dehors de toutes les suggestions de regex qui ne supportent généralement pas tous des TLD disponibles (y compris par exemple .info et .museum) et de la décision à venir de l'ICANN d'autoriser le chinois et l'arabe dans les URL (ce qui laisserait [a-z] et \w échouer) pour pour lequel l'expression rationnelle plus générique suivante est suffisante

([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)

Je voudrais également mentionner que faire un WHERE user=test OR [email protected] est trop sujet aux erreurs. Mieux vaut utiliser un PK généré automatiquement dans la table et l’utiliser dans la clause WHERE.

Je ne vois pas vraiment l'intérêt de mailregex stricts, longs et illisibles, conformes aux spécifications RFCxxxx. La meilleure solution consiste toujours à envoyer un courrier contenant un lien avec une clé d'activation à l'utilisateur final afin de lui permettre de confirmer l'adresse de messagerie. Informez-le également dans le formulaire. Si nécessaire, laissez l’utilisateur taper deux fois l’adresse électronique comme vous le faites pour les mots de passe.

2
BalusC

Puisque tout le monde affiche son expression régulière, voici le mien: ^((([\w+-]+)(.[\w+-]+)*)|(\"[^(\|\")]{0,62}\"))@(([a-zA-Z0-9-]+.)+([a-zA-Z0-9]{2,})|[?([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})(.([1]?\d{1,2}|2[0-4]{1}\d{1}|25[0-5]{1})){3}]?)$

À ma connaissance, il prend en charge tout le contenu de la spécification RFC, y compris beaucoup d'éléments que la plupart des gens n'incluent pas.

2
Scott
$user_email = "[email protected]";

function isEmail($user) {
     if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
          return true
     } else {
          return false
     }
}

if (isEmail($user_email)) {
     // email is valid, run the query
     mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$user_email");
}
2
iamkoa
$user_email = "email@gmailcom";

function isEmail($email) {
     if(eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
          return true;
     } else {
          return false;
     }
}

if (isEmail($user_email)) {
     // email is ok!
} else {
     // email not ok
}
0
Douglas Evaristo