有人知道如何在Swift中验证电子邮件地址吗?我找到了这个代码:
- (BOOL) validEmail:(NSString*) emailString {
if([emailString length]==0){
return NO;
}
NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];
NSLog(@"%i", regExMatches);
if (regExMatches == 0) {
return NO;
} else {
return YES;
}
}
但我无法翻译成斯威夫特。
以下是目前Swiftmailer中一个非常简单的方法。其他大多数答案都是老掉牙的。
根据Swiftmailer文档:
https://swiftmailer.symfony.com/docs/messages.html#quick-reference
use Egulias\EmailValidator\EmailValidator;
use Egulias\EmailValidator\Validation\RFCValidation;
$validator = new EmailValidator();
$validator->isValid("example@example.com", new RFCValidation()); //true
在我看来,这是迄今为止最简单、最健壮的方法。只需通过Composer安装egalias \EmailValidator库,它应该已经作为SwiftMailer的依赖项引入了。
以上大多数正则表达式示例在电子邮件存在基本问题时都无法捕获错误。例如
h..1@nyu.edu -连续的点
ab1234@.nyu.edu - @后面的点
a.bcdnle12.@email.com - @前的点
.abc@email.com -以一个点开始
这是一个字符串扩展,我使用了更严格的规则使用正则表达式。
extension String {
func isValidEmail() -> Bool {
let emailRegEx = "^(?!\\.)([A-Z0-9a-z_%+-]?[\\.]?[A-Z0-9a-z_%+-])+@[A-Za-z0-9-]{1,20}(\\.[A-Za-z0-9]{1,15}){0,10}\\.[A-Za-z]{2,20}$"
let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailPred.evaluate(with: self)
}
}
下面是我们如何为它编写测试用例。
XCTAssertFalse("ab1234@.nyu.edu".isValidEmail())
XCTAssertTrue("valid_email@email.com".isValidEmail())
对于那些还在寻找答案的人,请看看下面的框架;
ATGvalidator
它是一个基于规则的验证框架,可以处理大部分开箱即用的验证。最重要的是,它有表单验证器,支持同时验证多个文本字段。
要验证电子邮件字符串,请使用以下方法;
"abcd.hhs@some.com".satisfyAll(rules: [StringRegexRule.email]).status
如果你想验证从文本字段的电子邮件,尝试下面的代码;
textfield.validationRules = [StringRegexRule.email]
textfield.validationHandler = { result in
// This block will be executed with relevant result whenever validation is done.
print(result.status, result.errors)
}
// Below line is to manually trigger validation.
textfield.validateTextField()
如果您想在文本框中输入或当焦点更改到另一个字段时验证它,请添加以下行之一;
textfield.validateOnInputChange(true)
// or
textfield.validateOnFocusLoss(true)
请在链接处查看自述文件以获取更多用例。
我建议使用它作为String的扩展:
extension String {
public var isEmail: Bool {
let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length))
return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
}
public var length: Int {
return self.characters.count
}
}
要使用它:
if "hodor@gameofthrones.com".isEmail { // true
print("Hold the Door")
}
我唯一添加到响应列表的是,对于Linux, NSRegularExpression不存在,它实际上是RegularExpression
func isEmail() -> Bool {
let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
#if os(Linux)
let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
#else
let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
#endif
return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
在macOS和Ubuntu上都能成功编译。
作为String类扩展
斯威夫特4
extension String {
func isValidEmail() -> Bool {
// here, `try!` will always succeed because the pattern is valid
let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
}
}
使用
if "rdfsdsfsdfsd".isValidEmail() {
}