web-dev-qa-db-fra.com

Vérifier qu'une adresse email est valide sur iOS

Duplicate possible:
Meilleures pratiques pour la validation de l'adresse de messagerie dans Objective-C sur iOS 2.0?

Je développe une application iPhone où j'ai besoin que l'utilisateur donne son adresse e-mail lors de la connexion.

Quel est le meilleur moyen de vérifier si une adresse email est une adresse email valide?

200
raaz

Bonne fonction cacao:

-(BOOL) NSStringIsValidEmail:(NSString *)checkString
{
   BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
   NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
   NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
   NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
   NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
   return [emailTest evaluateWithObject:checkString];
}

Discussion sur Lax vs. Strict - http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

Et comme les catégories sont simplement meilleures, vous pouvez également ajouter une interface:

@interface NSString (emailValidation) 
  - (BOOL)isValidEmail;
@end

Mettre en place

@implementation NSString (emailValidation)
-(BOOL)isValidEmail
{
  BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
  NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
  NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
  NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
  NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
  return [emailTest evaluateWithObject:self];
}
@end

Et ensuite utiliser:

if([@"[email protected]" isValidEmail]) { /* True */ }
if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ }
551
BadPirate

Pour vérifier si une variable de chaîne contient une adresse électronique valide, la méthode la plus simple consiste à la tester avec une expression régulière. Il existe une bonne discussion sur les différentes expressions rationnelles et leurs compromis sur regular-expressions.info .

En voici une relativement simple qui autorise certaines adresses invalides à: ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$

La manière dont vous pouvez utiliser les expressions régulières dépend de la version d'iOS que vous utilisez.

iOS 4.x et versions ultérieures

Vous pouvez utiliser NSRegularExpression, qui vous permet de compiler et de tester directement avec une expression régulière.

iOS 3.x

N'inclut pas la classe NSRegularExpression, mais inclut NSPredicate, qui peut correspondre à des expressions régulières.

NSString *emailRegex = ...;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
BOOL isValid = [emailTest evaluateWithObject:checkString];

Lisez un article complet sur cette approche à l'adresse cocoawithlove.com .

iOS 2.x

N'inclut aucune correspondance d'expression régulière dans les bibliothèques Cocoa. Toutefois, vous pouvez facilement inclure RegexKit Lite dans votre projet, ce qui vous donne accès aux API de regex de niveau C incluses dans iOS 2.0.

7
benzado

Voici un bon exemple avec NSRegularExpression qui fonctionne pour moi.

[text rangeOfString:@"^.+@.+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;

Vous pouvez insérer ce que vous voulez, mais j'aime bien pouvoir le faire en une seule ligne.

6
jasongregori

pour valider la chaîne de courrier électronique, vous devez écrire une expression régulière afin de vérifier si elle se présente bien. Il y en a beaucoup sur le Web, mais soyez prudent, car certains peuvent exclure des adresses réellement légales.

essentiellement, il ressemblera à quelque chose comme ça

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

En fait, vérifier si l’email existe et ne rebondit pas, c’est envoyer un email et voir quel est le résultat. c'est-à-dire qu'il a rebondi ou non. Cependant, il pourrait ne pas rebondir pendant plusieurs heures ou pas du tout et ne pas toujours être une "vraie" adresse email. Il existe un certain nombre de services sur le marché qui sont censés faire cela pour vous et seraient probablement payés par vous. Franchement, pourquoi se donner la peine de voir si c'est réel?

Il est bon de vérifier que l'utilisateur n'a pas mal orthographié son courrier électronique, sinon il pourrait le saisir incorrectement, ne pas s'en rendre compte et se faire pirater avec vous pour ne pas répondre. Toutefois, si quelqu'un souhaite ajouter une adresse électronique bum, rien ne les empêchera de le créer sur hotmail ou yahoo (ou de nombreux autres endroits) pour obtenir le même résultat.

Il en va de même pour l'expression régulière et la validation de la structure, mais oubliez la validation par rapport à un service.

3
PurplePilot