201

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

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

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

4

4 回答 4

554

良好的可可功能:

-(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 */ }
于 2010-09-03T17:50:28.803 回答
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。

于 2011-05-22T21:00:17.810 回答
6

这是一个对我有用的 NSRegularExpression。

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

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

于 2011-07-19T23:37:29.090 回答
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(或许多其他地方)上创建它以获得相同的目的。

所以做正则表达式并验证结构,但忘记验证服务。

于 2010-06-29T11:32:53.343 回答