web-dev-qa-db-fra.com

rails - REGEX pour la validation des emails

Je cherche une regex pour valider un email pour savoir s'il est valide ou non .. J'ai les éléments suivants:

def is_a_valid_email?(email)
    email_regex = %r{
      ^ # Start of string
      [0-9a-z] # First character
      [0-9a-z.+]+ # Middle characters
      [0-9a-z] # Last character
      @ # Separating @ character
      [0-9a-z] # Domain name begin
      [0-9a-z.-]+ # Domain name middle
      [0-9a-z] # Domain name end
      $ # End of string
    }xi # Case insensitive

    (email =~ email_regex)
end

Le problème avec ce qui précède est que [email protected] ne retourne pas aussi valide que prévu. Des idées ou des suggestions pour une meilleure expression rationnelle?

Merci

16
AnApprentice

Mon coup à cela (voir commentaire et lien ci-dessus):

^.+@.+$
11
jensgram
validates_format_of :email, 
  :with => /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i

Ne me demandez pas de l'expliquer! C’est à partir d’un plugin de validation que j’ai perdu de vue puisque tout ce dont j’avais besoin était le regex email.

24
scragz

La réponse de @ jensgram est vraiment bonne, mais elle permet toujours d'envoyer un courrier électronique sans domaine, par exemple. foo @ bar est aussi valide que [email protected].

Voici une légère variation qui nécessite [email protected]:

/\A\S+@.+\.\S+\z/

ou plus lisible (bien que les parenthèses ne soient pas nécessaires):

/\A(\S+)@(.+)\.(\S+)\z/

Jouez avec cela

* Remarque: cette expression rationnelle est meilleure que beaucoup d'autres, plus complexes, en raison de la diversité incroyable d'un courrier électronique. Techniquement, un courrier électronique peut même utiliser des espaces s'il est placé entre guillemets, par exemple. "Ceci est un email valide" @ email.com

* Edit: j'ai remplacé le ^ et $ par \A et \z pour éviter une erreur d'ancrage multiligne lors du test de Rails.

* Edit: Merci à @Barry pour avoir remarqué que la regex permettait les espaces blancs. Mise à jour de l'expression rationnelle avec\S pour empêcher les courriels contenant des espaces non appropriés. Plusieurs points sont toujours autorisés car [email protected] est une adresse acceptable.

11
Sam Thornton

Pas assez de réputation pour ajouter un commentaire, mais si vous allez utiliser l'expression rationnelle Devise et que vous utilisez déjà Devise lui-même, vous pouvez simplement utiliser:

validates :email, presence: true, format: Devise.email_regexp

9
apanzerj
/\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/

C'est ce que j'utilise pour valider le courrier électronique.

Source: http://www.regular-expressions.info/email.html

8
Mblake

La plupart de ces autres réponses sont trop restrictives ou autorisent des adresses manifestement fausses. Il est donc préférable de ne pas être trop strict, ce qui frustrera les utilisateurs et ne réglera que les problèmes principaux. 

1. Cas d'utilisation le plus courant:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }

2. Pour autoriser également root@localhost ou homer@blinky, utilisez ceci:

    validates :email, ..., format: { with: /\A[^@\s]+@([^@.\s]+\.)*[^@.\s]+\z/ }

Aucune de ces réponses ne remplace la recherche de CAPTCHAs, d’enregistrements DNS, de listes noires de domaines DNS, de listes noires IP et d’e-mails de confirmation.

Pour la validation réelle du domaine de messagerie, elle peut être utilisée à la place: https://Gist.github.com/9200104

Ce cheval est maintenant complètement battu et transformé en croquette.

5
Barry

Voici un regex email que j'ai utilisé pendant un moment:

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

C'est de ici

1
ryanprayogo

^.+@[\w]+\S[^\s]+$

Une brève amélioration pour répondre d'abord

1
Buniowy

utiliser: /\A[^@\s]+@[^@\s]+\z/

Il affirme qu'il n'y a pas de symboles @ ni d'espaces, que ce soit dans la partie locale ou dans le domaine, et qu'un seul symbole @ sépare la partie locale et le domaine.

Plus important encore: nécessite une vérification de l'email 

Au fur et à mesure de la création de tld, il s’agit d’une réflexion prospective.

Cela provient de Devise , Un standard de l’industrie pour l’authentification.

1
Blair Anderson

Pour la validation du courrier électronique, je viens avec cette expression régulière,

/^[\w\d]+@[\w\d]+(\.[\w\d]+)+$/

Je ne sais pas à quel point ça va vous aider mais ça fonctionne très bien pour moi.

Si quelqu'un trouve cela échouant pour une adresse email, merci de me répondre afin que je puisse travailler davantage sur ce sujet.

0
Swapnil Chincholkar