首页 文章

检查iOS上的电子邮件地址是否有效[重复]

提问于
浏览
201

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

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

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

4 回答

  • 552

    对于我来说,NSRegularExpression是一个很好的人 .

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

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

  • 7

    良好的可可功能:

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

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

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

    基本上它看起来像这样

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

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

相关问题