2009-07-01 6 views
0

J'ai un formulaire web asp.net où je peux entrer une adresse e-mail.Validation des adresses email (ASP.NET)

i besoin de valider ce domaine avec des adresses e-mail ci-dessous ONLYin le pettern:

[email protected] [email protected] [email protected]

S'il vous plaît aider

+1

Ceci est l'un de ces les choses que les gens soulignent comme une utilisation classique des expressions régulières qui est terriblement difficile à obtenir correctement. Le simple fait qu'il y ait tant de réponses qui pointent les bogues dans les réponses des autres ne fait que le prouver. Et c'est la raison pour laquelle j'essaie d'éviter les expressions régulières pour des choses bien connues comme les adresses e-mail, les URL, etc. Utilisez une bibliothèque. – Lee

+0

Dans ce cas, toutefois, l'utilisation d'une bibliothèque signifie la validation après la publication plutôt que la validation sur le formulaire. Certains codes sont difficiles à écrire, mais valent la peine d'être écrits. –

Répondre

7

Une expression régulière pour valider ce serait:

^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$ 

C# échantillon:

string emailAddress = "[email protected]"; 
string pattern = @"^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$"; 
if (Regex.IsMatch(emailAddress, pattern, RegexOptions.IgnoreCase)) 
{ 
    // email address is valid 
} 

exemple VB:

Dim emailAddress As String = "[email protected]" 
Dim pattern As String = "^[A-Z0-9._%+-]+((@home\.co\.uk)|(@home\.com)|(@homegroup\.com))$"; 
If Regex.IsMatch(emailAddress, pattern, RegexOptions.IgnoreCase) Then 
    ' email address is valid 
End If 
+0

Attention: Votre expression correspondra également "bonjour je suis [email protected]" car elle contient une expression valide. – Huppie

+0

Merci Huppie, ceci est corrigé maintenant –

+0

Guys aucune de vos expressions ne fonctionne; Je l'ai vérifié en mettant vos expressions en tant que valeur de propriété de validateur d'expression régulière. Le contrôle ne valide pas. S'il vous plaît voir ma question à nouveau; il n'y a pas de base de départ nulle part ... et je me demande comment la base est arrivée en réponse: -o –

0

Essayez ceci:

Regex matcher = new Regex(@"([a-zA-Z0-9_\-\.]+)\@((home\.co\.uk)|(home\.com)|(homegroup\.com))"); 

if(matcher.IsMatch(theEmailAddressToCheck)) 
{ 
    //Allow it 
} 
else 
{ 
    //Don't allow it 
} 

Vous aurez besoin d'ajouter l'espace de noms Regex à votre classe aussi:

using System.Text.RegularExpressions; 
+0

Faites attention à vos points, votre expression correspondra à quelqu'un @ homexco, uk par exemple –

+0

Ouais vous avez raison - pourriez-vous expliquer ce que les barres obliques inversées sur le vôtre font pour résoudre ce problème s'il vous plaît? Merci. –

+0

Ah je vois maintenant - juste un point est n'importe quel caractère, mais \. = littéral. Cool merci! –

0

Une méthode d'extension pour ce faire serait:

public static bool ValidEmail(this string email) 
    { 
     var emailregex = new Regex(@"[A-Za-z0-9._%-]+(@home\.co\.uk$)|(@home\.com$)|(@homegroup\.com$)"); 
     var match = emailregex.Match(email); 
     return match.Success; 
    } 
+0

Les gars, aucune de vos expressions ne fonctionne; Je l'ai vérifié en mettant vos expressions en tant que valeur de propriété de validateur d'expression régulière. Le contrôle ne valide pas. S'il vous plaît voir ma question à nouveau; il n'y a pas de base de données nulle part .. et je me demande comment la base est arrivée en réponse: -o –

+0

"homebase" n'est mentionné nulle part dans mon code. J'ai couru quelques tests et j'ai constaté qu'ils ont réussi, sauf lors de l'utilisation d'une adresse e-mail comme "[email protected]". Cela est passé quand il aurait dû échouer. Pour résoudre ce problème, j'ai ajouté le $ pour faire correspondre l'expression à la fin de la ligne. –

4

Selon la version de l'ASP .NET que vous utilisez, vous pouvez utiliser l'un des contrôles Form Validation dans votre boîte à outils sous 'Validation'. Ceci est probablement préférable à la mise en place de votre propre logique après une publication. Il existe plusieurs types que vous pouvez faire glisser vers votre formulaire et associer à des contrôles, et vous pouvez également personnaliser les messages d'erreur et le positionnement.

Il existe plusieurs types qui peuvent en faire un champ obligatoire ou assurez-vous qu'il se trouve dans une certaine plage, mais vous voulez probablement le validateur d'expressions régulières. Vous pouvez utiliser l'une des expressions déjà affichées ou je pense que Visual Studio peut fournir un exemple d'adresse e-mail.

+0

+1, bon point sur l'utilisation du contrôle de validation –

+0

Aussi +1, bonne réponse pour suggérer l'utilisation d'un contrôle de validation, en particulier en soulignant le contrôle du validateur regex. –

+0

Juste pour que ce soit clair, vous ne devez PAS remplacer la validation dorsale par une validation côté client. Vous DEVEZ certainement les utiliser tous les deux, ou uniquement côté serveur, mais jamais uniquement côté client. Les contrôles de validation sont excellents, mais ne remplacent pas la vraie validation côté serveur. – goldenratio

1

Je seconde l'utilisation d'une regex, cependant l'expression rationnelle de Patrick ne fonctionnera pas (mauvaise alternance). Essayez:

[A-Z0-9._%+-][email protected](\.co\.uk|(group)?\.com) 

Et ne pas oublier d'échapper antislashs dans une chaîne que vous utilisez dans le code source, en fonction de la langue utilisée.

"[A-Z0-9._%+-][email protected](\\.co\\.uk|(group)?\\.com)" 
+0

Guys aucune de vos expressions ne fonctionne; Je l'ai vérifié en mettant vos expressions en tant que valeur de propriété de validateur d'expression régulière. Le contrôle ne valide pas. S'il vous plaît voir ma question à nouveau; il n'y a aucune base nulle part .. et je me demande comment la base est venue dans les réponses: -o –

+0

Oups. Me sert droit de copier et coller ... –

1

Voici le regex officiel de RFC 2822, qui correspondent à une adresse e-mail appropriée:

(?:[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])+)\]) 
+0

Guys aucune de vos expressions ne fonctionne; Je l'ai vérifié en mettant vos expressions en tant que valeur de propriété de validateur d'expression régulière. Le contrôle ne valide pas. S'il vous plaît voir ma question à nouveau; il n'y a pas de base nulle part .. et je me demande comment la base est arrivée en réponse: -o quand j'ai donné [email protected] il est en cours de validation ..il ne devrait pas valider –

-1

Patricks de réponse semble assez bien élaboré, mais a quelques défauts.

  • Vous souhaitez regrouper des parties de la regex mais ne voulez pas les capturer.Par conséquent, vous devrez utiliser des parenthèses sans capture.
  • L'alternance est partiellement erronée.
  • Il ne teste pas si cela faisait partie de la chaîne ou de la chaîne entière
  • Il utilise Regex.Match au lieu de Regex.IsMatch.

Une meilleure solution en C# serait:

string emailAddress = "[email protected]"; 
if (Regex.IsMatch(emailAddress, @"^[A-Z0-9._%+-][email protected](?:\.co\.uk|(?:group)?\.com)$", RegexOptions.IgnoreCase)) 
{ 
    // email address is valid 
} 

Bien sûr d'être complètement sûr que toutes les adresses e-mail passe, vous pouvez utiliser une expression plus approfondie:

string emailAddress = "[email protected]"; 
if (Regex.IsMatch(emailAddress, @"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@home(?:\.co\.uk|(?:group)?\.com)$", RegexOptions.IgnoreCase)) 
{ 
    // email address is valid 
} 
+0

LOL ... bonne prise ... ça va apprends-moi à lire correctement la question :) – Kev

+0

Salut Huppie, peux-tu me dire si ma partie d'alternance est encore fausse? J'ai mis à jour ma réponse, avez-vous d'autres commentaires à ce sujet? –

+0

avez-vous vu homebase dans ma question? –

1

Utilisez un <asp:RegularExpressionValidator ../> avec l'expression régulière dans la propriété ValidateExpression.

6

Voilà comment je ferais la validation à l'aide System.Net.Mail.MailAddress:

bool valid = true; 
try 
{ 
    MailAddress address = new MailAddress(email); 
} 
catch(FormatException) 
{ 
    valid = false; 
} 

if(!(email.EndsWith("@home.co.uk") || 
    email.EndsWith("@home.com") || 
    email.EndsWith("@homegroup.com"))) 
{ 
    valid = false; 
} 

return valid; 

MailAddress première Confirme que c'est une adresse e-mail valide. Ensuite, le reste valide qu'il se termine avec les destinations dont vous avez besoin. Pour moi, c'est plus simple à comprendre pour tout le monde qu'une regex maladroite. Ce n'est peut-être pas aussi performant qu'une regex, mais il ne semble pas que vous en validiez un tas en boucle ... juste un à la fois sur une page Web