< p > 可能的重复: < br > 在iOS 2.0上的Objective-C中验证电子邮件地址的最佳实践? < / p >
我正在开发一个iPhone应用程序,我需要用户在登录时提供他的电子邮件地址。
检查电子邮件地址是否为有效电子邮件地址的最佳方法是什么?
要验证电子邮件字符串,您需要编写一个正则表达式来检查它的格式是否正确。网上有很多这样的地址,但要小心,因为有些地址会把真正的合法地址排除在外。
本质上是这样的
^((?>[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)>)$
实际上,检查电子邮件是否存在并且没有被退回意味着发送电子邮件并查看结果。也就是说,它是否反弹。然而,它可能不会反弹几个小时或根本不是,仍然不是一个“真正的”电子邮件地址。有很多服务声称为你做这件事,可能会由你付费,坦率地说,为什么要麻烦去看它是否真实?
最好检查用户是否拼错了他们的电子邮件,否则他们可能会输入错误,没有意识到,然后因为不回复而被黑客攻击。然而,如果有人想添加一个无用的电子邮件地址,没有什么可以阻止他们在hotmail或yahoo(或许多其他地方)上创建它来达到同样的目的。
因此使用正则表达式并验证结构,但忘记对服务进行验证。
良好的可可功能:
-(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]; }
Lax与Strict的讨论- 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 */ }
要检查字符串变量是否包含有效的电子邮件地址,最简单的方法是根据正则表达式测试它。在regular-expressions.info中有关于各种正则表达式及其权衡的很好的讨论。
这里是一个相对简单的,它倾向于允许一些无效地址通过:^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$
^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$
如何使用正则表达式取决于你使用的iOS版本。
你可以使用NSRegularExpression,它允许你直接编译和测试正则表达式。
NSRegularExpression
不包括NSRegularExpression类,但包括NSPredicate,它可以匹配正则表达式。
NSPredicate
NSString *emailRegex = ...; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; BOOL isValid = [emailTest evaluateWithObject:checkString];
在cocoawithlove.com上阅读关于此方法的完整文章。
在Cocoa库中不包括任何正则表达式匹配。然而,你可以很容易地在你的项目中包含RegexKit Lite,它可以让你访问iOS 2.0中包含的c级正则表达式api。
这里有一个很好的nsregulareexpression,这是为我工作。
[text rangeOfString:@"^.+@.+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;
你可以插入任何你想要的正则表达式,但我喜欢能够在一行中完成它。