检查一个电子邮件地址在iOS上有效

可能重复:
在iOS 2.0上validationObjective-C中的电子邮件地址的最佳实践?

我正在开发一个iPhone应用程序,我需要用户在login时给他的电子邮件地址。

检查电子邮件地址是否为有效电子邮件地址的最佳方法是什么?

好的cocoafunction:

-(BOOL) NSStringIsValidEmail:(NSString *)checkString { BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/ NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"; NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"; NSString *emailRegex = stricterFilter ? stricterFilterString : laxString; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:checkString]; } 

讨论松懈与严格 – http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

而因为类别更好,你也可以添加一个接口:

 @interface NSString (emailValidation) - (BOOL)isValidEmail; @end 

实行

 @implementation NSString (emailValidation) -(BOOL)isValidEmail { BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/ NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"; NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"; NSString *emailRegex = stricterFilter ? stricterFilterString : laxString; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; return [emailTest evaluateWithObject:self]; } @end 

然后利用:

 if([@"emailString@email.com" isValidEmail]) { /* True */ } if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ } 

要检查stringvariables是否包含有效的电子邮件地址,最简单的方法是使用正则expression式对其进行testing。 有一个很好的讨论正则expression式的各种正则expression式和他们的权衡。

这是一个比较简单的方法,它允许通过以下方式允许一些无效地址: ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,6}$

如何使用正则expression式取决于您使用的iOS版本。

iOS 4.x及更高版本

你可以使用NSRegularExpression ,它允许你直接编译和testing正则expression式。

iOS 3.x

不包括NSRegularExpression类,但包含NSPredicate ,它可以匹配正则expression式。

 NSString *emailRegex = ...; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; BOOL isValid = [emailTest evaluateWithObject:checkString]; 

在cocoawithlove.com阅读关于这种方法的完整文章。

iOS 2.x

在Cocoa库中不包含任何正则expression式匹配。 但是,您可以在项目中轻松包含RegexKit Lite ,从而使您可以访问iOS 2.0中包含的C级正则expression式API。

inheritance人NSRegularExpression是一个很好的工作对我来说。

[text rangeOfString:@"^.+@.+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;

你可以插入任何你想要的正则expression式,但我希望能够在一行中完成。

validation电子邮件string,您将需要编写一个正则expression式来检查它是在正确的forms。 网上有很多,但要小心,因为有些可以排除真正的合法地址。

基本上它会看起来像这样

 ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$ 

实际上检查电子邮件是否存在并不反弹将意味着发送电子邮件,看看结果是什么。 即它弹起或没有。 但是,它可能不会反弹几个小时,或者根本不是一个“真正的”电子邮件地址。 有一些服务在那里声称为你做这个,很可能会被你支付,坦率地说,为什么要麻烦看看它是真的吗?

这是很好的检查用户没有拼错他们的电子邮件,否则他们可以input它不正确,没有意识到,然后被黑客与你不答复。 但是,如果有人想添加一个垃圾邮件地址,将不会有任何阻止他们在Hotmail或雅虎(或许多其他地方)创造它,以获得相同的目的。

所以做正则expression式和validation结构,但忘记了对服务的validation。