【问题标题】:Check that an email address is valid on iOS [duplicate]检查电子邮件地址在 iOS 上是否有效 [重复]
【发布时间】:2011-03-09 13:14:25
【问题描述】:

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

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

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

【问题讨论】:

  • 有效的电子邮件是 user@mac.com 还是有效的电子邮件是存在并接受邮件的真实电子邮件?
  • 我想要两者,如果 abc@xyz.com 是否有效,或者用户提供任何无效的 id(例如 abc.com)我还想检查 abc@xyz.com 是一个真实的电子邮件将接受邮件。
  • 没有办法检查第二个条件。要检查字符串是否是有效的电子邮件,只需扫描它以查看 '@' 和 .有没有

标签: objective-c cocoa email email-validation


【解决方案1】:

良好的可可功能:

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

【讨论】:

  • 我正在使用NSString *stricterFilterString = @"^[_A-Za-z0-9-+]+(\\.[_A-Za-z0-9-+]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,4})$";
  • 谢谢@WarifAkhandRishi -- 我已经更新了字符串来处理你的否定测试用例。
  • 或者迅速;) 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 = strict ? stricterFilterString : laxString; var emailTest:NSPredicate = NSPredicate(format:"SELF MATCHES %@", emailRegex); return emailTest.evaluateWithObject(checkString); }
  • .museum 和 .travel 等新 TLD 不会通过严格的测试。
  • 如果我输入带有空格字符的电子邮件地址,此验证将失败
【解决方案2】:

要检查字符串变量是否包含有效的电子邮件地址,最简单的方法是根据正则表达式对其进行测试。 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。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 这在 Swift 中是一个更好的选择,因为 rangeOfString() 返回一个可选项,如果没有匹配则为 nil
    【解决方案4】:

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

    基本上它看起来像这样

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

    正则表达式也是如此并验证结构,但忘记验证服务。

    【讨论】:

    • 这是一个非常糟糕的正则表达式。要使用它,您需要以具有 NSRegularExpression 类的 iOS 4.0 为目标,或者使用为早期版本的 iOS 编译的众多正则表达式静态库之一。
    • 其实可以使用NSPredicate,它可以处理正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2015-11-19
    • 2015-09-03
    相关资源
    最近更新 更多