Écrivez une fonction ou un programme pour valider une adresse e-mail par rapport à la RFC 5321 (certaines règles de grammaire trouvées dans 5322 ) avec la relaxation que vous pouvez ignorer les commentaires et le pliage des espaces ( CFWS
) et des littéraux d'adresse généralisés. Cela donne la grammaire
Mailbox = Local-part "@" ( Domain / address-literal )
Local-part = Dot-string / Quoted-string
Dot-string = Atom *("." Atom)
Atom = 1*atext
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
Quoted-string = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP = qtextSMTP / quoted-pairSMTP
qtextSMTP = %d32-33 / %d35-91 / %d93-126
quoted-pairSMTP = %d92 %d32-126
Domain = sub-domain *("." sub-domain)
sub-domain = Let-dig [Ldh-str]
Let-dig = ALPHA / DIGIT
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
address-literal = "[" ( IPv4-address-literal / IPv6-address-literal ) "]"
IPv4-address-literal = Snum 3("." Snum)
IPv6-address-literal = "IPv6:" IPv6-addr
Snum = 1*3DIGIT
; representing a decimal integer value in the range 0 through 255
Remarque: J'ai ignoré la définition de IPv6-addr
parce que ce RFC particulier se trompe et interdit par exemple ::1
. La spécification correcte se trouve dans la RFC 2373 .
Restrictions
Vous ne pouvez pas utiliser d'appels de bibliothèque de validation de courrier électronique existants. Cependant, vous pouvez utiliser les bibliothèques réseau existantes pour vérifier les adresses IP.
Si vous écrivez une fonction / méthode / opérateur / équivalent, elle doit prendre une chaîne et renvoyer une valeur booléenne ou véridique / fausse, selon votre langue. Si vous écrivez un programme, il doit prendre une seule ligne de stdin et indiquer valide ou invalide via le code de sortie.
Cas de test
Les cas de test suivants sont répertoriés dans des blocs pour plus de compacité. Le premier bloc sont des cas qui devraient passer:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
email@[123.123.123.123]
"email"@domain.com
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
""@domain.com
"e"@domain.com
"\@"@domain.com
email@domain
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/[email protected]
[email protected]
!def!xyz%[email protected]
[email protected]
_somename@[IPv6:::1]
[email protected]
[email protected]
[email protected]
Les cas de test suivants ne doivent pas réussir:
plainaddress
#@%^%#$@#$@#.com
@domain.com
Joe Smith <[email protected]>
email.domain.com
email@[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected] (Joe Smith)
[email protected]
[email protected]
email@[IPv6:127.0.0.1]
email@[127.0.0]
email@[.127.0.0.1]
email@[127.0.0.1.]
email@IPv6:::1]
[email protected]]
email@[256.123.123.123]
la source
IPv6-addr
a été laissé indéfini, et il existe des cas de test qui ont des adresses ipv6, existe-t-il un moyen correct de les valider?[email protected]
et[email protected]
échouer?Réponses:
Python 3.3, 261
Python 3.3 est nécessaire pour le module ipaddress, qui est utilisé pour valider les adresses IPv4 et IPv6.
Version moins golfée:
la source
ALPHA
à BNF augmenté et les littéraux char construisant unQuoted-string
sont tous insensibles à la casse. pouvez-vous raser quelques caractères en spécifiant l'insensibilité à la casse et en abandonnant l'une de ces plages de classes de caractères? btw, si vous vous sentez fringant, pouvez-vous donner une brève description de la façon dont vous avez développé cela?PHP 5.4.9, 495
Et juste pour plus d'intérêt, en voici une pour la grammaire RFC 5322 qui permet le CFWS imbriqué et les parties locales obsolètes:
(764)
Et si les limites de longueur ne sont pas obligatoires:
RFC 5321 (414)
RFC 5322 (636)
la source