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

raa*_*aaz 200 email cocoa objective-c email-validation

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

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

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

Bad*_*ate 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];
}
Run Code Online (Sandbox Code Playgroud)

关于Lax vs. Strict的讨论 - http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

而且因为类别更好,您还可以添加一个界面:

@interface NSString (emailValidation) 
  - (BOOL)isValidEmail;
@end
Run Code Online (Sandbox Code Playgroud)

实行

@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
Run Code Online (Sandbox Code Playgroud)

然后利用:

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

  • 或者在swift中;)`func isValidEmail(checkString:NSString,strictFilter strict:Bool) - > Bool {var stricterFilterString ="[A-Z0-9a-z \\ ._%+ - ] + @([A-Za Z0-9 - ] + \\)+ [A-ZA-Z] {2,4}".var laxString =".+ @([A-Za-z0-9] + \\.)+ [A-Za-z] {2} [A-Za-z]*"; var emailRegex =严格?stricterFilterString:laxString; var emailTest:NSPredicate = NSPredicate(格式:"SELF MATCHES%@",emailRegex); return emailTest.evaluateWithObject(checkString); }` (9认同)
  • 像.museum和.travel这样的新顶级域名不会通过严格的测试. (4认同)
  • 我正在使用`NSString*stricterFilterString = @"^ [_ A-Za-z0-9 - +] +(\\.[_ A-Za-z0-9 - +] +)*@ [A-Za-z0- 9 - ] +(.\\ [A-ZA-Z0-9 - ] +)*(\\ [A-ZA-Z] {2,4})$";` (3认同)
  • 谢谢@WarifAkhandRishi - 我已经更新了字符串来处理你的负面测试用例. (3认同)
  • 如果我正在使用space charector输入emai laddress,那么这个验证会变得混乱 (2认同)

ben*_*ado 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];
Run Code Online (Sandbox Code Playgroud)

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

iOS 2.x.

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


jas*_*ori 6

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

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

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