Vérifiez si une chaîne est une adresse e-mail en PHP
-
19-09-2019 - |
Question
Je suis en train de faire une requête SQL, mais je dois vérifier en quelque sorte si la valeur est une adresse e-mail.
Je besoin d'un moyen de vérifier si $user
est une adresse e-mail, parce que j'ai des valeurs de l'utilisateur, comme dans mon tableau.
test
test2
test@example.com
test2@example.com
test392
test@example.net
et ainsi de suite ...
je dois faire si les contrôles $useremail
$user
pour savoir si c'est une adresse e-mail. Je peux donc actualiser les valeurs, WHERE user=test OR user=test@example.com
, etc.
$user = strtolower($olduser);
$useremail = "";
mysql_query("UPDATE _$setprofile SET user=$sn, fc=$fc WHERE user='$user' OR user='$useremail");
La solution
Ce n'est pas une bonne méthode et ne vérifie pas si l'e-mail existe mais il vérifie si elle ressemble à un e-mail avec le @ et l'extension de domaine.
function checkEmail($email) {
$find1 = strpos($email, '@');
$find2 = strpos($email, '.');
return ($find1 !== false && $find2 !== false && $find2 > $find1);
}
$email = 'name@email.com';
if ( checkEmail($email) ) {
echo $email . ' looks like a valid email address.';
}
Autres conseils
Sans expressions régulières:
<?php
if(filter_var("some@address.com", FILTER_VALIDATE_EMAIL)) {
// valid address
}
else {
// invalid address
}
?>
L'approche la plus simple est d'utiliser une expression régulière pour vérifier les adresses e-mail, bien qu'il y ait un certain désaccord sur la façon dont cela peut être précis. Ce processus est décrit en détail ici:
En utilisant une expression régulière pour valider une adresse e-mail
Vous pouvez utiliser REGEXP dans MySQL pour sélectionner la base de données en fonction de votre expression régulière:
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.';
}
Vous pouvez utiliser des expressions régulières pour valider votre chaîne d'entrée pour voir si elle correspond à une adresse e-mail:
<?php
$email = "someone@example.com";
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, s'il vous plaît se référer à Travis répondre sur cette question
Cette fonction is_email () vous donnera une réponse définitive à savoir si la chaîne est une adresse e-mail valide ou ne pas. Pour autant que je sache, aucune autre solution le fera avec le même niveau d'autorité.
Si je comprends bien l'exemple correctement, vous l'utiliser comme ceci
$user = strtolower($olduser);
$useremail = (is_email($user)) ? $user : '';
Le PHP fonction intégrée est incomplète. Je suis l'auteur principal is_email()
donc je souffle ma trompette, mais je l'ai mis beaucoup de travail dans ce afin que personne d'autre ne devrait avoir à jamais.
Je me sers de cette fonction depuis de nombreuses années à travers des centaines de sites. Il est sans doute pas parfait, mais je ne l'ai jamais eu une plainte de faux négatifs (ou 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;
}
En dehors de toutes les suggestions regex qui la plupart du temps ne supporte pas les tous de son (y compris par exemple .info
et de .museum
) et la décision à venir de l'ICANN pour permettre chinois et l'arabe dans URL du TLD disponibles (ce qui laisserait [a-z]
et \w
échec) pour lesquels les éléments suivants regex plus générique est suffisante
([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)
Je mentionne aussi que faire un WHERE user=test OR user=test@example.com
est trop sujette aux erreurs. Mieux utiliser un PK autogénérés dans le tableau et l'utiliser dans la clause WHERE
.
Je ne vois pas vraiment la valeur de mailregexes strictes, longs et illisibles conformes aux spécifications de RFCxxxx. Le meilleur moyen est encore d'envoyer un mail avec un lien avec une clé d'activation à l'utilisateur final de le laisser confirmer l'adresse mail. Informer que sous la forme aussi bien. Si nécessaire laisser l'utilisateur saisir l'adresse e-mail deux fois comme vous le faites pour les mots de passe.
$user_email = "email@string.com";
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");
}
Comme tout le monde affichant leur 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}]?)$
Au meilleur de ma connaissance, il prend en charge tout dans la spécification RFC, y compris beaucoup de choses que la plupart des gens ne comprennent généralement pas.
$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
}