2017-01-27 2 views
2

Я использую проверки электронной почты в моем проекте, какой метод, как показано нижеEmail Validation не так, как на Regex

//MARK: isValidEmailID 
    func isValidEmail(testStr:String) -> Bool { 
     print("validate emilId: \(testStr)") 
     let emailRegEx = "^(?:(?:(?:(?:)*(?:(?:(?:\\t|)*\\r\\n)?(?:\\t|)+))+(?:)*)|(?:)+)?(?:(?:(?:[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?:)*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?:)*)|(?:)+)\"))(?:@)(?:(?:(?:[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])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?:)*[!-Z^-~])*(?:)*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?:)*(?:(?:(?:\\t|)*\\r\\n)?(?:\\t|)+))+(?:)*)|(?:)+)?$" 
     let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
     let result = emailTest.evaluateWithObject(testStr) 
     return result 
    } 

ИЛИ

func isValidEmailID(email: String) -> Bool { 
     let regExPattern: String = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,}" 
     let emailValidator: NSPredicate = NSPredicate(format: "SELF MATCHES %@", regExPattern) 
     let isValid: Bool = emailValidator.evaluateWithObject(email) 
     return isValid 
    } 

это как Regex прекрасно работает, когда я вхожу «modijecky @ gmail.com "или любой другой неправильный ввод, но он не будет работать, когда я войду в" [email protected] ".

Итак, я узнал, что «имя @ .com.com» является допустимым адресом электронной почты, и есть больше поддоменов, подобных этому. Поэтому теперь я хочу, чтобы пользователь не вводил поддомены. Существует ли какой-либо REGEX, который проверяет адрес электронной почты только в одном домене, например «[email protected]», а не в нескольких доменах или поддоменах.

Я также пытаюсь использовать Regex из Google и внедрять его в проект, но такая же проблема возникает.
Пожалуйста, помогите мне с этим.
Спасибо

+0

Почему 'modijecky @ gmail.com.com' считается ошибочным? 'com.com' является допустимым доменом, а также' gmail.com.com'. См. Https://en.wikipedia.org/wiki/Email_address#Examples – Toto

+0

Единственный безопасный способ проверки электронной почты - отправить электронное письмо и дождаться возврата. – Toto

+0

Пожалуйста, уточните мой обновленный ответ –

ответ

0

вызов функции:

let result = isValidEmail(testStr: "[email protected]") 
     if (result) 
     { 
      print ("passed") 
     } 
     else{ 
      print ("failed") 
     } 

Функция Определение:

func isValidEmail(testStr:String) -> Bool { 
     // print("validate calendar: \(testStr)") 
     var returnValue : Bool = false 
     let emailRegEx = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,}" 
     let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
     if (emailTest.evaluate(with: testStr)) 
     { 
      let fullNameArr = testStr.components(separatedBy: "@") 
      let IdName = fullNameArr[0] 
      let domainName = fullNameArr[1] 
      var number = 0 
      let string = domainName 
      for character in domainName.characters { 
       if character == "." 
       { 
        number = number + 1 
       } 
      } 
      if number <= 1 
      { 
       returnValue = true 
      } 
     } 
     return returnValue 
    } 

Результат:

enter image description here enter image description here

+0

Такая же проблема, она вернет true, когда я наберу «[email protected]». Извините, но он не работает –

+0

Я сказал в своем вопросе, что я не хочу субдоменов, я хочу сделать это, как с одним доменом, например «[email protected]», а не с подобластью, например «[email protected]» ' –

+0

Да, приятель Я не хочу .com.com, я хочу только одного .com –

6

Не изобретайте колесо:

Not Reinventing the Wheel: Email Validation in Swift

В принципе вы можете использовать NSDataDetector делать тяжелую работу и есть все, что последовательное и обновляются с тем, как он работает в MacOS и прошивке изначально. Не только это, но и вы избегаете головных болей регулярных выражений.

// Simplifying the example from the website a bit 

import Foundation 

func validate(_ text: String) -> Bool { 
    guard let dataDetector = try? 
    NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else { 
    return false 
    } 
    let allMatches = dataDetector.matches(in: text, 
             options: [], 
             range: NSMakeRange(0, (text as NSString).length)) 
    guard let absoluteString = allMatches.first?.url?.absoluteString else { return false } 
    return absoluteString == "mailto:\(text)" 
} 

validate("[email protected]") // -> true 
validate(" [email protected]") // -> false 

Это гарантирует, что весь текст будет единственным, действительным адресом электронной почты без лишних символов.

+0

Это проверяет идентификатор почты внутри? –

+1

Я не использовал его в тестовых случаях, но он, похоже, обнаруживает наиболее распространенные плохие адреса. – ColGraff

+2

Я также буду использовать его вместо регулярного выражения, кажется менее склонным к ошибке и чистой благодарностью за обмен. :) –

0

вы должны иметь этот код, чтобы не допускать субдомен.

func isValidEmail(email:String) -> Bool { 

    if email.range(of: "@") == nil || email.range(of: ".") == nil{ 
     return false 
    } 

    let accountName = email.substring(to: email.range(of: "@")!.lowerBound) 

    let domainName = email.substring(from: email.range(of: "@")!.upperBound) 

    let subDomain = domainName.substring(from: email.range(of: ".")!.lowerBound) 



    //filter for user name 
    let unWantedInUName = " [email protected]#$^&*()={}[]|;’:\"<>,?/`"; 
    //filter for domain 
    let unWantedInDomain = " [email protected]#$%^&*()={}[]|;’:\"<>,+?/`"; 
    //filter for subdomain 
    let unWantedInSub = " `[email protected]#$%^&*()={}[]:\";’<>,?/1234567890"; 

    //subdomain should not be less that 2 and not greater 6 
    if(!(subDomain.characters.count>=2 && subDomain.characters.count<=6)) { 
     return false; 
    } 

    if (accountName == "" || accountName.rangeOfCharacter(from: CharacterSet.init(charactersIn: unWantedInUName)) != nil || domainName == "" || domainName.rangeOfCharacter(from: CharacterSet.init(charactersIn: unWantedInDomain)) != nil || subDomain == "" || subDomain.rangeOfCharacter(from: CharacterSet.init(charactersIn: unWantedInSub)) != nil) { 
     return false 
    } 

    return true 
} 
+0

Я проверю его, а потом скажу, что он работает или нет. –

+0

уверен, что я протестировал на детской площадке :) –

+0

@JeckyModi modi это сработало или нет, если есть какие-либо проблемы, тогда, пожалуйста, дайте мне знать? –