代码之家  ›  专栏  ›  技术社区  ›  raaz

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

  •  200
  • raaz  · 技术社区  · 15 年前

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

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

    4 回复  |  直到 8 年前
        1
  •  554
  •   BadPirate    10 年前

    良好的可可功能:

    -(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];
    }
    

    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 */ }
    
        2
  •  7
  •   benzado    14 年前

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

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

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

    iOS 4.x及更高版本

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

    iOS 3.x版

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

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

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

    iOS 2.x版

    在Cocoa库中不包含任何正则表达式匹配。但是,您可以轻松地包括 RegexKit Lite 在您的项目中,它允许您访问ios2.0中包含的C级regexapi。

        3
  •  6
  •   jasongregori    14 年前

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

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

    你可以插入任何正则表达式你想要的,但我喜欢能够做到这一点,在一行。

        4
  •  3
  •   PurplePilot    15 年前

    基本上它看起来像这样

    ^((?>[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)>)$
    

    实际上,检查电子邮件是否存在并且没有反弹意味着发送一封电子邮件并查看结果。i、 它反弹或不反弹。然而,它可能不会反弹几个小时或根本没有,仍然不是一个“真正的”电子邮件地址。有许多服务,声称为您这样做,可能会由您支付,坦率地说,为什么要费心去看看它是不是真的?

    这是很好的检查用户没有错发他们的电子邮件,否则他们可能会输入错误,没有意识到这一点,然后被黑客与你没有回复。然而,如果有人想添加一个垃圾电子邮件地址,没有什么可以阻止他们在hotmail或yahoo(或许多其他地方)上创建它来达到同样的目的。

    所以要执行正则表达式并验证结构,但不要考虑对服务进行验证。