检查iOS上的电子邮件地址是否有效

时间:2010-06-29 10:01:49

标签: objective-c cocoa email email-validation

  

可能重复:
  Best practices for validating email address in Objective-C on iOS 2.0?

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

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

4 个答案:

答案 0 :(得分:551)

良好的可可功能:

-(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 vs. 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 */ }

答案 1 :(得分:7)

要检查字符串变量是否包含有效的电子邮件地址,最简单的方法是针对正则表达式对其进行测试。在regular-expressions.info对各种正则表达式及其权衡进行了很好的讨论。

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

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

iOS 4.x及更高版本

您可以使用NSRegularExpression,它允许您直接编译和测试正则表达式。

iOS 3.x

不包括NSRegularExpression类,但包括NSPredicate,它可以与正则表达式匹配。

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

cocoawithlove.com阅读有关此方法的完整文章。

iOS 2.x

在Cocoa库中不包含任何正则表达式匹配。但是,您可以轻松地在项目中包含RegexKit Lite,这样您就可以访问iOS 2.0中包含的C级正则表达式API。

答案 2 :(得分:6)

这是一个很好的NSRegularExpression,它对我有用。

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

你可以插入你想要的任何正则表达式,但我喜欢能够在一行中完成。

答案 3 :(得分:3)

验证您需要编写正则表达式的电子邮件字符串,以检查它是否格式正确。网络上有很多,但要小心,因为有些人可以排除实际上合法的地址。

基本上它看起来像这样

^((?>[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(或许多其他地方)创建它以获得同样的目的。

正则表达式和验证结构,但忘记验证服务。

相关问题