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

时间:2009-04-28 22:37:25

标签: cocoa-touch email-validation iphone-sdk-2

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

注意:这是一个特定于iOS 2.0的历史问题,由于其年龄和与其相关的其他问题,它不能退役,不得更改为“现代” “问题。

13 个答案:

答案 0 :(得分:354)

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

我推荐一种真正的解析器方法,例如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];
}

答案 1 :(得分:20)

阅读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 "\"

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

答案 2 :(得分:17)

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

添加到项目中非常轻松,一旦到位,任何正则表达式电子邮件验证逻辑都将起作用。

答案 3 :(得分:10)

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

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

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

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

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

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

答案 4 :(得分:7)

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

最重要的是:

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

  2. 在dns验证后,您还可以选择执行smtp验证。 发送一个对smtp服务器的调用 查看用户是否确实存在。

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

答案 5 :(得分:7)

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

在正则表达式中使用锚也很重要,如此函数中所示。如果没有锚点,则以下电子邮件地址被视为有效: first; name)lastname@domain.com(blah ,因为 lastname@domain.com 部分有效,忽略第一个;名称)在开头,(blah 在结尾.Anchors强制正则表达式引擎验证整个电子邮件。

此功能使用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

答案 6 :(得分:6)

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. 

答案 7 :(得分:4)

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

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

以下是指向良好来源的链接http://www.regular-expressions.info/email.html

答案 8 :(得分:3)

挖掘污垢,但我偶然发现了SHEmailValidator,它做得很好并且界面很好。

答案 9 :(得分:1)

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

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

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

通常,一系列更小,更易于管理的RegEx更容易维护和调试。

答案 10 :(得分:0)

这是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

答案 11 :(得分:-2)

您不应该尝试使用正则表达式验证电子邮件。随着TLD的不断变化,您的验证器要么不完整,要么不准确。相反,您应该利用Apple的NSDataDetector库来获取字符串并尝试查看是否有任何已知的数据字段(电子邮件,地址,日期等)。 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)"
    }
}

答案 12 :(得分:-7)

// 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;
}