15

UITextfield私の iPhone アプリケーションにはパスワード用の1があります。

このテキストフィールドを次の検証で検証したいと思います。

  • 10文字以上である必要があります
  • 少なくとも 1 つの小文字、1 つの大文字、1 つの数字、および 1 つの特殊文字を含める必要があります
  • 有効な特殊文字は –@#$%^&+=^.*(?=.{10,})(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

UITextField上記の要件で制限するにはどうすればよいですか?

4

11 に答える 11

27

これは私がそれを行う方法です。検証は、ユーザーがパスワードを入力したときに最後に行う必要があり、その間ではありませんNSRegularExpression

-(void)textFieldDidEndEditing:(UITextField *)textField{
   int numberofCharacters = 0;
   BOOL lowerCaseLetter,upperCaseLetter,digit,specialCharacter = 0;
   if([textField.text length] >= 10)
   {
      for (int i = 0; i < [textfield.text length]; i++) 
      {
         unichar c = [textfield.text characterAtIndex:i];
         if(!lowerCaseLetter)
         {
           lowerCaseLetter = [[NSCharacterSet lowercaseLetterCharacterSet] characterIsMember:c];
         }
         if(!upperCaseLetter)
         {
           upperCaseLetter = [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:c];
         }
         if(!digit)
         {
            digit = [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c];
         }
         if(!specialCharacter)
         {
            specialCharacter = [[NSCharacterSet symbolCharacterSet] characterIsMember:c];
         }
      }

      if(specialCharacter && digit && lowerCaseLetter && upperCaseLetter)
      {
         //do what u want
      }
      else
      { 
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Please Ensure that you have at least one lower case letter, one upper case letter, one digit and one special character"
                                                       delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
      }

   }
   else
   {
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Please Enter at least 10 password"
                                                       delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
   }
}

お役に立てれば...

于 2013-03-01T12:57:02.710 に答える
18

を使用してこれを行うこともできますRegex。ここに私があなたに提供しているいくつかの例があります:

// *** 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)

リストの4 番目はあなたのケースです。次のコード スニペットは、その使用方法を示しています。

-(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];
}

メソッドの使用:

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
}
于 2015-12-09T12:35:48.677 に答える
14

条件: パスワードには少なくとも 8 文字 (大文字 1 つと数字 1 つ) が含まれている必要があります

Swift 3 のソリューション

このようにString Extensionを書くことができます。

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

または、次のように関数を書くことができます。

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

これにより、同じ結果が得られます。

于 2016-11-10T11:08:48.287 に答える
5

以下の関数を使用してパスワードの検証を確認するには、パスワード文字列を渡すだけで、BOOL 値が返されます。

-(BOOL) isPasswordValid:(NSString *)pwd {

    NSCharacterSet *upperCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLKMNOPQRSTUVWXYZ"];
    NSCharacterSet *lowerCaseChars = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"];

    //NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

    if ( [pwd length]<6 || [pwd length]>20 )
        return NO;  // too long or too short
    NSRange rang;
    rang = [pwd rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]];
    if ( !rang.length )
        return NO;  // no letter
    rang = [pwd rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
    if ( !rang.length )
        return NO;  // no number;
    rang = [pwd rangeOfCharacterFromSet:upperCaseChars];
     if ( !rang.length )
         return NO;  // no uppercase letter;
    rang = [pwd rangeOfCharacterFromSet:lowerCaseChars];
    if ( !rang.length )
        return NO;  // no lowerCase Chars;
    return YES;
}
于 2014-02-12T06:26:15.337 に答える
4

私にとって最良の方法はNSPredicate、正規表現を使用することでした。これはあなたの場合の正規表現です:^(?=.{10,})(?=.*[0-9])(?=.*[a-zA-Z])([@#$%^&=a-zA-Z0-9_-]+)$

debuggex.com で作成された画像

目的の C コード:

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];
于 2015-12-28T11:29:38.037 に答える
2

正規表現を使用します (NSRegularExpression クラスには、パターン自体の書き方に関するドキュメントがあります)。

- (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //delete
    if (string.length == 0) {
        return YES;
    }

    if (self.regEx) {
        NSMutableString* check = [NSMutableString stringWithString:theTextField.text];
        [check replaceCharactersInRange:range withString:string];
        NSTextCheckingResult* match = [self.regEx firstMatchInString:check options:0 range:NSMakeRange(0, [check length])];
        if (match.range.length != check.length) {
            return NO;
        }
    }
}

警告: このように入力を制限すると、ユーザーは非常に混乱します。何度も入力しても、入力した文字が表示されない!

テスト フィールドの横に小さな赤 (!) を表示することもできますが、入力自体は常に許可します。

于 2013-02-28T09:57:14.283 に答える
1

NSTextFieldの値を検証できるプロトコルのcontrol:isValidObject:メソッドを使用します。NSTextFieldDelegateすべてのInterfaceBuilderのビットとピースが正しく構成されていると仮定すると、次のようなことを行うことができます。

@interface PreferencesController : NSWindowController <NSTextFieldDelegate> {
    IBOutlet NSTextField *username, *password;
}

@end

@implementation PreferencesController

- (BOOL)control:(NSControl *)control isValidObject:(id)object
{
    if (control == password) {
      // Perform validation and return YES or NO
    }

    return YES;
}

@end
于 2013-02-28T09:58:19.787 に答える
1

のこのデリゲート メソッドに検証コードを記述する必要があります。UITextField

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

実装のために参照する必要があるかもしれないいくつかのリンク

iOS SDK で正規表現を使用する方法

iOS TextField の検証

于 2013-02-28T09:54:15.720 に答える