145 votes

Comment vérifier si l'entrée est une adresse e-mail dans Flutter ?

Selon RegExp nous devons utiliser JavaScript ( Perl 5 ) expressions régulières : Spécification de l'ECMA . Quelle méthode dois-je utiliser dans Dart pour vérifier si l'entrée est un email ?

5 votes

À partir de 2019 : pour prendre correctement en charge la validation des e-mails dans Dart/Flutter, veuillez consulter le paquet pub.dev email_validator.

277voto

Pavel Ismailov Points 49

Pour cela, une simple expression rationnelle fonctionne très bien.

var email = "tony@starkindustries.com"
bool emailValid = RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(email);

8 votes

La meilleure réponse ici. Si vous ne pouvez pas identifier tous Pour les courriels valides, il est préférable d'être indulgent et de ne pas frustrer vos utilisateurs.

0 votes

Il existe de nombreux caractères valides dans la section locale, qui ne sont pas inclus dans cette expression ; par exemple, l'opérateur + n'est pas inclus, comme a+b@c.d ; d'autres caractères valides incluent !#$%&'*+-/=?^_`{|}~ et d'autres encore sont valides moyennant des restrictions supplémentaires.

3 votes

Pour les personnes qui considèrent que cette réponse est la plus votée au moment de la publication, elle n'est pas acceptée. name+filter@domain.com ce qui correspond au nombre d'utilisateurs qui filtreront automatiquement les e-mails dans leur boîte de réception. N'utilisez donc pas cette option si vous ne voulez pas les ennuyer. Si vous voulez la regex la plus indulgente, utilisez la réponse acceptée. Simple !== meilleure.

100voto

763 Points 1143

En utilisant le RegExp des réponses par Eric y Justin ,
J'ai créé une méthode d'extension pour String :

extension EmailValidator on String {
  bool isValidEmail() {
    return RegExp(
            r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')
        .hasMatch(this);
  }
}

TextFormField(
  autovalidate: true,
  validator: (input) => input.isValidEmail() ? null : "Check your email",
)

0 votes

Pas " ;". c'est "," n'est-ce pas ? mais les vôtres sont une bonne idée.

0 votes

Oui, merci pour le rapport. Je l'ai corrigé.

0 votes

Perfeect, Dart Regexp ne fonctionne pas en copiant-collant le regex de HTML5, votre code a les corrections dont il a besoin pour fonctionner correctement, merci pour cela ! :D

89voto

Justin Fagnani Points 4043

Je recommande à tout le monde de se standardiser sur la spécification de validation des emails HTML5, qui diffère de la RFC822 en interdisant plusieurs caractéristiques très rarement utilisées des adresses email (comme les commentaires !), mais qui peuvent être reconnues par des regex.

Voici la section sur la validation des e-mails dans la spécification HTML5 : http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29

Et voici l'expression rationnelle :

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?)*$

2 votes

C'est le même modèle que j'ai collé, mais je ne l'ai pas marqué comme code et il a été échappé. S'il ne valide toujours pas les adresses électroniques, c'est au W3C de s'en occuper :)

4 votes

Un peu tard, mais... Ce n'est pas un travail - c'est valable pour la chaîne "s@s".

9 votes

Elle est valable pour a@a

36voto

Eric Lavoie Points 644

J'utilise ce modèle : validate-email-address-in-javascript . (Enlever la barre oblique / et ajouter les délimiteurs Dart : r' ' ).

bool isEmail(String em) {

  String p = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';

  RegExp regExp = new RegExp(p);

  return regExp.hasMatch(em);
}

EDIT :

Pour plus d'informations sur la validation des e-mails, consultez ces articles : dominicsayers.com y expressions régulières.info . Cet outil peut également être très utile : gskinner RegExr .

EDIT : Justin en a une meilleure. J'utilise le modèle qu'il a proposé.

1 votes

Ce modèle n'accepte que les TLD de 3 caractères maximum. Il y a beaucoup de TLD plus grands que cela.

17voto

David_E Points 407

Le meilleur modèle regEx que j'ai trouvé est le RFC2822 Email Validation :

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Tiré de : regexr.com/2rhq7

Tous les autres regEx que j'ai testés, marquent la chaîne de caractères email@email comme un positif, ce qui est faux.

0 votes

Pourquoi la meilleure réponse n'est-elle pas celle-ci ?

0 votes

Cela fonctionne réellement. Je l'ai testé.

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