Password validation in UITextField in iOS

前端 未结 11 1063
有刺的猬
有刺的猬 2020-12-01 12:54

I have 1 UITextfield for password in my iPhone application.

I want to validate this textfield with the following validation.

  • Must be at le
相关标签:
11条回答
  • 2020-12-01 13:26

    Condition: Password should contain atleast 8 characters, 1 uppercase and 1 number

    Solution in Swift 3

    you can write String Extension like this,

    extension String {
        func isValidPassword() -> Bool {
            let regularExpression = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}"
            let passwordValidation = NSPredicate.init(format: "SELF MATCHES %@", regularExpression)
    
            return passwordValidation.evaluate(with: self)
        }
    }
    
    //Example 1
    
    var password = "@Abcdef011" //string from UITextField (Password)
    password.isValidPassword() // -> true
    
    //Example 2
    
    var password = "Abcdef011" //string from UITextField 
    password.isValidPassword() // -> false
    

    or you can write function like this,

    func validate(password: String) -> Bool
    {
        let regularExpression = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}"
    
        let passwordValidation = NSPredicate.init(format: "SELF MATCHES %@", regularExpression)
    
        return passwordValidation.evaluate(with: password)
    }
    

    this will give you the same result.

    0 讨论(0)
  • 2020-12-01 13:26

    Swift 3

    check if password is strong ?

    1. length more than or equal 8
    2. lowercase
    3. uppercase
    4. decimal Digits
    5. special characters like !@#$%^&*()_-+ is optional

      Why i not use regular expression ?

      Because it's difficult to support reserved characters in regular expression syntax.


     func isValidated(_ password: String) -> Bool {
         var lowerCaseLetter: Bool = false
         var upperCaseLetter: Bool = false
         var digit: Bool = false
         var specialCharacter: Bool = false
    
         if password.characters.count  >= 8 {
             for char in password.unicodeScalars {
                 if !lowerCaseLetter {
                     lowerCaseLetter = CharacterSet.lowercaseLetters.contains(char)
                 }
                 if !upperCaseLetter {
                     upperCaseLetter = CharacterSet.uppercaseLetters.contains(char)
                 }
                 if !digit {
                     digit = CharacterSet.decimalDigits.contains(char)
                 }
                 if !specialCharacter {
                     specialCharacter = CharacterSet.punctuationCharacters.contains(char)
                 }
             }
             if specialCharacter || (digit && lowerCaseLetter && upperCaseLetter) {
                 //do what u want
                 return true
             }
             else {
                 return false
             }
         }
         return false
     }
     let isVaildPass:Bool = isValidated("Test**00+-")
     print(isVaildPass)
    
    0 讨论(0)
  • 2020-12-01 13:28

    I have this elegant solution for Forms (like sign-up) where you have a lot of validation

    I have in my custom UITextField the outlet:

    @IBInspectable var regexpValidation: String? = nil
    

    In storyboard I can access it through attribute inspector and put regexp string like that (for email):

    [a-z0-9!#$%&'*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

    then in my subclass I have this computed var:

    @IBInspectable var regexpValidation: String? = nil // Optional, Set this in InterfaceBuilder

    var inputIsValid: Bool {
        get {
            if let expr = regexpValidation {
               return (text.rangeOfString(expr, options: NSStringCompareOptions.RegularExpressionSearch, range: nil, locale: nil) != nil)
            } else {
                return true
            }
    
        }
    }
    

    which could be used like this:

       override func resignFirstResponder() -> Bool {
            if (inputIsValid) {
                return super.resignFirstResponder()
            }
            else {
                text = ""
                return false
            }
        }
    
    0 讨论(0)
  • 2020-12-01 13:29

    for me Best way was to use NSPredicate and regex. this is regex for your case: ^(?=.{10,})(?=.*[0-9])(?=.*[a-zA-Z])([@#$%^&=a-zA-Z0-9_-]+)$

    objective C code:

    NSString *regex = @"^(?=.{10,})(?=.*[0-9])(?=.*[a-zA-Z])([@#$%^&=a-zA-Z0-9_-]+)$";
    
    NSPredicate *passwordTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    
    BOOL isValid = [passwordTest evaluateWithObject:yourTextfield.text];
    
    0 讨论(0)
  • 2020-12-01 13:38

    You can also do this by using Regex. Here are few example I am providing for you:

    // *** Validation for Password ***
    
        // "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$" --> (Minimum 8 characters at least 1 Alphabet and 1 Number)
        // "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[$@$!%*#?&])[A-Za-z\\d$@$!%*#?&]{8,16}$" --> (Minimum 8 and Maximum 16 characters at least 1 Alphabet, 1 Number and 1 Special Character)
        // "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$" --> (Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet and 1 Number)
        // "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,}" --> (Minimum 8 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character)
        // "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,10}" --> (Minimum 8 and Maximum 10 characters at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 1 Number and 1 Special Character)
    

    Fourth from the list is your case, following code snippet shows how to use it:

    -(BOOL)isValidPassword:(NSString *)passwordString
    {
        NSString *stricterFilterString = @"^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{10,}";
        NSPredicate *passwordTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", stricterFilterString];
        return [passwordTest evaluateWithObject:passwordString];
    }
    

    Using the method:

    if(![self isValidPassword:txtPassword.text]) {
        /* Show alert: "Password must be minimum 10 characters,
           at least 1 Uppercase Alphabet, 1 Lowercase Alphabet, 
           1 Number and 1 Special Character" */
    }
    else {
        // Password is valid
    }
    
    0 讨论(0)
提交回复
热议问题