C#电子邮件地址验证
只是我想澄清一件事。 根据客户端请求,我们必须创建一个正则表达式,以便在电子邮件地址中允许使用撇号。
根据RFC标准,我的问题是电子邮件地址是否包含一个端口? 如果是的话如何重新创建正则表达式以允许撇号 ?
下面的正则表达式实现了电子邮件地址的官方RFC 2822标准。 不推荐在实际应用中使用这个正则表达式。 它表明,通过正则表达式,确切和实际之间总是有一个折衷。
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-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-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])
你可以使用简化的:
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
是的,只要不在域名中,电子邮件中允许使用撇号。
这是我写的验证属性。 它几乎验证了每个“原始”电子邮件地址,即那些形式为local-part @ * domain *的地址。 它不支持任何其他的,更多... RFC的允许的创造性构造(这个列表不是全面的):
jsmith@whizbang.com (work)
) foo@[123.45.67.012]
) John Smith <jsmith@whizbang.com>
) 它应该接受几乎所有可以表达的电子邮件地址
foo.bar@bazbat.com
而不需要使用引号( "
),尖括号('<>')或方括号( []
)。
没有尝试验证域中最右边的dns标签是有效的顶级域名(顶级域名)。 这是因为TLD名单现在比“big 6”(.com,.edu,.gov,.mil,.net,.org)加上两个字母的ISO国家代码要大得多。 ICANN实际上每天更新TLD列表,但我怀疑这个列表实际上并没有每天更改。 此外,ICANN刚刚批准了通用顶级域名(TLD)名称空间的大规模扩展)。 有些电子邮件地址没有你认为的TLD(你知道postmaster@.
在理论上是有效和可邮寄的吗?通过邮件发送到DNS根区的邮件主管。)
扩展正则表达式以支持域文字,它不应该太难。
干得好。 健康地使用它:
using System;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
namespace ValidationHelpers
{
[AttributeUsage( AttributeTargets.Property | AttributeTargets.Field , AllowMultiple = false )]
sealed public class EmailAddressValidationAttribute : ValidationAttribute
{
static EmailAddressValidationAttribute()
{
RxEmailAddress = CreateEmailAddressRegex();
return;
}
private static Regex CreateEmailAddressRegex()
{
// references: RFC 5321, RFC 5322, RFC 1035, plus errata.
string atom = @"([A-Z0-9!#$%&'*+-/=?^_`{|}~]+)" ;
string dot = @"(.)" ;
string dotAtom = "(" + atom + "(" + dot + atom + ")*" + ")" ;
string dnsLabel = "([A-Z]([A-Z0-9-]{0,61}[A-Z0-9])?)" ;
string fqdn = "(" + dnsLabel + "(" + dot + dnsLabel + ")*" + ")" ;
string localPart = "(?<localpart>" + dotAtom + ")" ;
string domain = "(?<domain>" + fqdn + ")" ;
string emailAddrPattern = "^" + localPart + "@" + domain + "$" ;
Regex instance = new Regex( emailAddrPattern , RegexOptions.Singleline | RegexOptions.IgnoreCase );
return instance;
}
private static Regex RxEmailAddress;
public override bool IsValid( object value )
{
string s = Convert.ToString( value ) ;
bool fValid = string.IsNullOrEmpty( s ) ;
// we'll take an empty field as valid and leave it to the [Required] attribute to enforce that it's been supplied.
if ( !fValid )
{
Match m = RxEmailAddress.Match( s ) ;
if ( m.Success )
{
string emailAddr = m.Value ;
string localPart = m.Groups[ "localpart" ].Value ;
string domain = m.Groups[ "domain" ].Value ;
bool fLocalPartLengthValid = localPart.Length >= 1 && localPart.Length <= 64 ;
bool fDomainLengthValid = domain.Length >= 1 && domain.Length <= 255 ;
bool fEmailAddrLengthValid = emailAddr.Length >= 1 && emailAddr.Length <= 256 ; // might be 254 in practice -- the RFCs are a little fuzzy here.
fValid = fLocalPartLengthValid && fDomainLengthValid && fEmailAddrLengthValid ;
}
}
return fValid ;
}
}
}
干杯!
链接地址: http://www.djcxy.com/p/16579.html