在iOS 2.0上validation电子邮件地址的最佳做法是什么?

validation用户在iOS 2.0上input的电子邮件地址的最简洁的方法是什么?

注意 :这是一个特定于iOS 2.0的历史问题,由于它的年龄以及与其相关的问题有多less,所以不能退休,也不能改为“现代”问题。

使用正则expression式validation电子邮件地址的答案详细解释了RFC 5322中指定的语法对于原始正则expression式来说过于复杂。

我推荐一个真正的parsing器方法,如MKEmailAddress 。

作为快速正则expression式解决scheme,请参阅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]; } 

阅读RFC。 几乎每个认为自己知道如何parsing/清理/validation电子邮件地址的人都是错误的。

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

 dtext = NO-WS-CTL /; 非空白空间控制

                         %d33-90 /; 美国ASCII的其余部分
                         %d94-126; 不包括“[”,
                                         ;  “]“, 要么 ”\”

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

到目前为止,我发现的最好的解决scheme(以及我最终select的解决scheme)是将RegexKitLite添加到通过NSString类别访问正则expression式的项目。

将项目添加到项目中是非常容易的,一旦到位,任何正则expression式电子邮件validation逻辑都将起作用。

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

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

不过,从技术angular度看,这样的电子邮件地址是合法的:f !#$%&'*+-/=?^_ {|}〜“ha!”@ com

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

除此之外,按照Paul的说法,尝试将input与正则expression式匹配,如下所示:^ [A-Z0-9 ._%+ – ] + @ [A-Z0-9 .-] +。[AZ] { 2,} $

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

虽然正则expression式的重点是好的,但这只是第一个必要的步骤。 还有其他步骤也需要考虑一个好的validation策略。

我头上有两件事:

  1. DNSvalidation,以确保该域实际存在。

  2. 在dnsvalidation之后,你也可以select做一个smtpvalidation。 发送一个电话到smtp服务器,看看用户是否真的存在。

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

这个function很简单,但是更仔细地检查电子邮件地址。 例如,根据RFC2822,电子邮件地址不得包含连续两个句点,例如firstname.lastname @ domain..com

正如本函数中所看到的,在正则expression式中使用锚也是很重要的。 如果没有锚点,则以下电子邮件地址被认为是有效的: first; name)lastname@domain.com(blah,因为lastname@domain.com部分是有效的,忽略第一个;名称) ,并在最后等于结束。正则expression式引擎来validation整个电子邮件。

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

 - (BOOL)isValidEmail:(NSString *)email { NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[az]{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]; } 

请参阅在Objective-C中使用正则expression式validation电子邮件地址 。

 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. 

我发现使用正则expression式可以很好地validation电子邮件地址。

正则expression式的主要缺点当然是可维护性,所以评论就像你以前从未评论过的一样。 我向你保证,如果你不这样做,你会希望你在几个星期后回到expression的时候去做。

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

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

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

为了学习正则expression式,解释型语言可以是一个很棒的简化器和testing平台。 Rubularbuild立在Ruby上,但是是一个很好的快速testing和validation的方法: http ://www.rubular.com/

除此之外,购买最新版本的O'Reilly书籍掌握正则expression式。 你会想花时间去了解前三四章。 之后的一切将build立高度优化的正则expression式使用的专业知识。

通常一系列更小,更容易pipe理的RegExes更容易维护和debugging。

以下是在Swift中validation电子邮件的string的扩展。

 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) } } 

从答复复制到: 检查一个电子邮件地址在iOS上是有效的

你不应该尝试使用正则expression式来validation电子邮件。 随着TLD的不断变化,您的validation器不完整或不准确。 相反,你应该利用苹果的NSDataDetector库,它将采取一个string,并尝试查看是否有任何已知的数据字段(电子邮件,地址,date等)。 苹果公司的SDK将尽最大努力与TLD保持同步,并且可以背负他们的努力! 🙂

另外,如果iMessage(或任何其他文本字段)不认为这是一个电子邮件,你应该考虑一个电子邮件?

我把这个函数放在一个NSString类中,所以你testing的string是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)" } } 
 // 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; }