首页 文章

验证iOS 2.0上的电子邮件地址的最佳做法是什么

提问于
浏览
167

验证用户在iOS 2.0上输入的电子邮件地址的最简洁方法是什么?

NOTE :这是一个特定于iOS 2.0的历史问题,由于其年龄和与其相关的其他问题,它不能退役,不能更改为"modern"问题 .

13 回答

  • 354

    我发现使用正则表达式可以很好地验证电子邮件地址 .

    当然,正则表达式的主要缺点是可维护性,因此您之前从未评论过评论 . 我保证,如果你不这样做,你会希望你在几周之后回到表达时做 .

    这是一个很好的来源链接http://www.regular-expressions.info/email.html .

  • 0

    你不应该使用字符串并尝试查看是否有任何已知的数据字段(电子邮件,地址,日期等) . Apple的SDK将尽最大努力与TLD保持同步,您可以捎带他们的努力! :)

    另外,如果iMessage(或任何其他文本字段)认为它不是电子邮件,您是否应该考虑发送电子邮件?

    我将此函数放在 NSString 类别中,因此您正在测试的字符串是 self .

    - (BOOL)isValidEmail {
        // Trim whitespace first
        NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
        if (self && self.length > 0) return NO;
    
        NSError *error = nil;
        NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
        if (!dataDetector) return NO;
    
        // This string is a valid email only if iOS detects a mailto link out of the full string
        NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
        if (error) return NO;
        return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
    }
    

    或者作为一个快速的 String 扩展名

    extension String {
        func isValidEmail() -> Bool {
            let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
            guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
                return false
            }
            let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))
    
            return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
        }
    }
    
  • 17

    挖掘污垢,但我偶然发现了SHEmailValidator,这是一个完美的工作,并有一个很好的界面 .

  • 6

    此功能很简单,但更彻底地检查电子邮件地址 . 例如,根据RFC2822,电子邮件地址不得包含连续的两个句点,例如firstname..lastname @ domain..com

    在正则表达式中使用锚也很重要,如此函数中所示 . 没有锚点,以下电子邮件地址被认为是有效的:第一个;名称)lastname@domain.com(因为lastname@domain.com部分是有效的,首先忽略;名称),在开头和(等等) . 锚点强制正则表达式引擎来验证整个电子邮件 .

    此功能使用NSPredicate,这在iOS 2中不存在 . 不幸的是,它可能无法帮助提问者,但希望能帮助其他人使用更新版本的iOS . 此函数中的正则表达式仍然可以应用于iOS 2中的RegExKitLite . 对于使用iOS 4或更高版本的用户,可以使用NSRegularExpression实现这些正则表达式 .

    - (BOOL)isValidEmail:(NSString *)email
    {
        NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z";
        NSString *regex2 = @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*";
        NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1];
        NSPredicate *test2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
        return [test1 evaluateWithObject:email] && [test2 evaluateWithObject:email];
    }
    

    validate email address using regular expression in Objective-C .

  • 7

    Using a regular expression to validate an email address的答案非常详细地解释了RFC 5322中指定的语法对于原始正则表达式而言过于复杂 .

    I recommend a real parser approach like MKEmailAddress.

    作为快速正则表达式解决方案,请参阅DHValidation的此修改:

    - (BOOL) validateEmail: (NSString *) candidate {
        NSString *emailRegex =
    @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
    @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
    @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
    @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
    @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
    @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
    @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
        NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; 
    
        return [emailTest evaluateWithObject:candidate];
    }
    
  • 7

    一个好的开始是决定你和你不想接受什么作为电子邮件地址?

    99%的电子邮件地址如下所示:bob.smith@foo.com或fred@bla.edu

    但是,拥有这样的电子邮件地址在技术上是合法的:f !#$%&'*+-/=?^_ {|}〜"ha!" @com

    对于顶级域名,世界上可能只有少数有效的电子邮件,而且几乎没有人使用其他大多数字符(特别是引号和反引号),所以你可能想要假设这些都是无效的事情 . 但你应该这样做是有意识的决定 .

    除此之外,做Paul所说的并尝试将输入匹配到这样的正则表达式:^ [A-Z0-9 ._% - ] @ [A-Z0-9.-] . [AZ] {2,} $

    那个人几乎会匹配每个人的电子邮件地址 .

  • -7

    虽然对正则表达式的关注很好,但这只是第一个必要的步骤 . 还有其他步骤也需要考虑一个好的验证策略 .

    我头顶的两件事是:

    • DNS验证以确保域实际存在 .

    • 在dns验证后,您还可以选择执行smtp验证 . 向smtp服务器发送呼叫以查看用户是否确实存在 .

    通过这种方式,您可以捕获各种用户错误并确保它是有效的电子邮件 .

  • 20

    许多网站提供RegExes,但您最好学习和理解它们,并验证您希望它做什么,在官方RFC中为电子邮件地址格式满足您的需求 .

    为了学习RegEx,解释语言可以是一个很好的简化和测试平台 . Rubular是基于Ruby构建的,但它是一种快速测试和验证的方法:http://www.rubular.com/

    除此之外,购买最新版本的O'Reilly书籍Mastering Regular Expressions . 您需要花时间了解前3或4章 . 之后的一切将是 Build 高度优化的RegEx使用的专业知识 .

    通常,一系列更小,更易于管理的RegExs更易于维护和调试 .

  • 3

    这是String的扩展,用于验证Swift中的电子邮件 .

    extension String {
    
        func isValidEmail() -> Bool {
            let stricterFilter = false
            let stricterFilterString = "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"
            let laxString = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
            let emailRegex = stricterFilter ? stricterFilterString : laxString
            let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
            return emailTest.evaluate(with: self)
        }
    }
    

    复制自答案:Check that an email address is valid on iOS

  • -2
    NSString *emailString = textField.text; **// storing the entered email in a string.** 
    **// Regular expression to checl the email format.** 
    NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; 
    if (([emailTest evaluateWithObject:emailString] != YES) || [emailStringisEqualToString:@""]) 
    { 
    UIAlertView *loginalert = [[UIAlertView alloc] initWithTitle:@" Enter Email in" message:@"abc@example.com format" delegate:self 
    cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
    
    enter code here
    
    [loginalert show]; 
    [loginalert release]; 
    } 
    If email is invalid, it will remind the user with an alert box. 
    Hope this might be helpful for you all.
    
  • 1

    到目前为止我找到的最好的解决方案(以及我最终使用的那个)是将RegexKitLite添加到通过NSString Categories访问正则表达式的项目中 .

    添加到项目并进入项目是非常轻松的地方,任何正则表达式电子邮件验证逻辑都可以工作 .

  • 10
    // Method Call
    NSString *email = @"Your Email string..";
    
    BOOL temp = [self validateEmail:email];
    
    if(temp)
    {
    // Valid
    }
    else
    {
    // Not Valid
    }
    // Method description
    
    - (BOOL) validateEmail: (NSString *) email {
        NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
        NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
        BOOL isValid = [emailTest evaluateWithObject:email];
        return isValid;
    }
    
  • 4

    阅读RFC . 几乎每个认为他们知道如何解析/清理/验证电子邮件地址的人都是错误的 .

    http://tools.ietf.org/html/rfc2822第3.4.1节非常有用 . 注意

    dtext           =       NO-WS-CTL /     ; Non white space controls
    
                            %d33-90 /       ; The rest of the US-ASCII
                            %d94-126        ;  characters not including "[",
                                            ;  "]", or "\"
    

    是的,这意味着'等等都是合法的 .

相关问题