168 votes

Quelles sont les meilleures pratiques pour valider les adresses électroniques sur iOS 2.0 ?

Quelle est la manière la plus propre de valider une adresse électronique qu'un utilisateur saisit sur iOS 2.0 ?

NOTE : Il s'agit d'une question historique spécifique à iOS 2.0 et, en raison de son ancienneté et du nombre d'autres questions qui y sont liées, elle ne peut pas être retirée et ne DOIT PAS être transformée en une question "moderne".

0 votes

Je suis à la recherche d'une solution de cacao. Je comprends la validité des emails et les règles autour de la validation des emails. Cependant, comme RegEx n'est pas facilement accessible sur Cocoa Touch, je cherche une solution Cocoa Touch pour la validation. Pas une liste des règles autour de la validation.

0 votes

Jusqu'à présent, la meilleure suggestion de code que j'ai trouvée consiste à utiliser RegExKitLite et les expressions régulières. Heureusement, c'est moins pénible qu'il n'y paraît.

0 votes

Voir les commentaires ci-dessous sur l'utilisation de NSRegularExpression pour les applications ne supportant pas os < 4.0.

354voto

catlan Points 9896

La réponse à Utilisation d'une expression régulière pour valider une adresse électronique explique en détail que la grammaire spécifiée dans la RFC 5322 est trop compliquée pour les expressions régulières primitives.

Je recommande une approche parser réelle comme MKEmailAddress .

Comme solution rapide pour les expressions régulières, voir cette modification de DHValidation :

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex =
@"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
@"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
@"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

9 votes

Super mais ne fonctionne pas sur OS <3.0, car NSPredicate n'est pas disponible.

4 votes

Joli. Tout le monde oublie que NSPredicate peut exécuter des regexps.

5 votes

C'est un très mauvais regexp. Par exemple, elle échouera pour les personnes utilisant le domaine supérieur .museum. Référez-vous à cet article : linuxjournal.com/article/9585

20voto

Trey Points 4170

Lire le RFC. Presque tous ceux qui pensent savoir comment analyser/nettoyer/valider une adresse électronique se trompent.

https://www.rfc-editor.org/rfc/rfc2822 La section 3.4.1 est très utile. Avis

dtext           =       NO-WS-CTL /     ; Non white space controls

                        %d33-90 /       ; The rest of the US-ASCII
                        %d94-126        ;  characters not including "\[",
                                        ;  "\]", or "\\"

Oui, cela signifie que +, ', etc. sont tous légitimes.

0 votes

Situation actuelle en mai 2016 : RFC5322, section 3.4.1

17voto

Marcus S. Zarra Points 32178

La meilleure solution que j'ai trouvée jusqu'à présent (et celle que j'ai finalement retenue) est d'ajouter RegexKitLite Au projet qui donne accès aux expressions régulières via les catégories NSString.

Il est assez facile à ajouter au projet et, une fois en place, toute logique de validation des courriels par expression régulière fonctionnera.

5 votes

NSPredicate peut faire du RegEx sans ajouter de bibliothèques supplémentaires à votre projet.

10 votes

Cette question, qui date d'avril 2009, était posée avant que NSPredicate n'existe sur iOS.

7 votes

Encore une fois, NSRegularExpression N'EXISTE PAS dans iOS 2.0 lorsque cette question a été posée.

10voto

Brandon Yarbrough Points 8558

Un bon début est de décider ce que vous voulez et ne voulez pas accepter comme adresse électronique.

99 % des adresses électroniques ressemblent à ceci : bob.smith@foo.com ou fred@bla.edu.

Cependant, il est techniquement légal d'avoir une adresse électronique comme celle-ci : f !#$%&'*+-/=?^_ {|}~ "ha !"@com

Il n'y a probablement qu'une poignée de courriels valides dans le monde pour les domaines de premier niveau, et presque personne n'utilise la plupart de ces autres caractères (en particulier les guillemets et les backticks), donc vous pourriez vouloir supposer que ce sont toutes des choses invalides à faire. Mais vous devez le faire de manière consciente.

Au-delà, faites ce que Paul dit et essayez de faire correspondre l'entrée à une expression régulière comme celle-ci : ^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}$

Celle-ci correspondra à peu près à l'adresse électronique de tout le monde.

0 votes

Bien que cette réponse ait été écrite en 2009, elle figure toujours en bonne place dans les résultats de recherche. je voulais juste ajouter que cette réponse n'est plus d'actualité et que la regex ci-dessus est un peu restrictive. par exemple, vous pouvez désormais avoir un domaine de premier niveau à 4 chiffres ou plus.

0 votes

Bon point, je l'ai modifié en "au moins 2 chiffres". N'hésitez pas à modifier davantage si vous le souhaitez.

7voto

Srikar Doddi Points 10611

L'accent mis sur les expressions régulières est une bonne chose, mais ce n'est qu'une première étape nécessaire. D'autres étapes doivent également être prises en compte pour une bonne stratégie de validation.

Les deux choses qui me viennent à l'esprit sont :

  1. Validation DNS pour s'assurer que le domaine existe réellement.

  2. Après la validation dns, vous pouvez également choisir de faire une validation smtp. envoyer un appel au serveur smtp pour voir si l'utilisateur existe réellement.

De cette façon, vous pouvez détecter toutes sortes d'erreurs de l'utilisateur et vous assurer qu'il s'agit d'un courriel valide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X