2012-02-16 7 views
11

Sto provando a mettere la convalida nel campo di testo che contiene l'indirizzo e-mail.
Cosa deve essere aggiunto nella stringa "emailRegEx" per limitare l'utente dall'inserimento di tre punti nell'indirizzo email o di quello che devo scrivere nel metodo per lo stesso.Convalida dell'indirizzo e-mail in UITextField

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

Ecco il mio codice:

- (BOOL)EmailValidationL:(NSString *)email 
{ 
    NSString *emailRegEx [email protected]"(?:[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 *regExPredicate = 
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegEx]; 
    a= [regExPredicate evaluateWithObject:email]; 
    return a; 
} 
+0

possibili DUPL icate di [Best practice per la convalida dell'indirizzo email in Objective-C su iOS 2.0?] (http://stackoverflow.com/questions/800123/best-practices-for-validating-email-address-in-objective-c-on -ios-2-0) – zpasternack

+0

@zpasternack: voglio convalidare dinamicamente, quell'utente non dovrebbe inserire il terzo punto.se entra e poi lo sostituisce con una stringa nulla.Il metodo sopra è valido nel metodo ShouldEndEditing – Ketan

+0

Ora che abbiamo nomi di domini UTF-8, come cambia queste espressioni regolari? per esempio. camtasia 教程 网 .com –

risposta

17

Ci sono meglio ways per convalidare un indirizzo di posta elettronica.

- (BOOL)validateEmailWithString:(NSString*)email 
{ 
    NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
    return [emailTest evaluateWithObject:email]; 
} 
+0

Voglio validare dinamicamente, quell'utente non dovrebbe inserire 3a punto.se entra e poi sostituirlo con una stringa nulla, il metodo Sopra convalida in metodo ShouldEndEditing – Ketan

8
NSString *emailReg = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailReg]; 

if ([emailTest evaluateWithObject:yourtextFieldName.text] == NO) 
{ 

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"enter the Valid Mail id" message:@"Please Enter Valid Email Address." delegate:nil cancelButtonTitle:@"okay" otherButtonTitles:nil]; 
[alert show]; 

} 

Swift

var emailReg: String = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" 
var emailTest: NSPredicate = NSPredicate(format: "SELF MATCHES %@", emailReg) 

if emailTest.evaluateWithObject(yourtextFieldName.text!) == false { 
var alert: UIAlertView = UIAlertView(title: "enter the Valid Mail id", message: "Please Enter Valid Email Address.", delegate: nil, cancelButtonTitle: "okay", otherButtonTitles: "") 
alert.show() 
} 

Swift3

let emailReg = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" 
let emailTest = NSPredicate(format: "SELF MATCHES %@", emailReg) 
if emailTest.evaluate(withObject: yourtextFieldName.text) == false { 
UIAlertView(title: "enter the Valid Mail id", message: "Please Enter Valid Email Address.", delegate: nil, cancelButtonTitle: "okay", otherButtonTitles: "").show() 
} 
+0

ThnQ karthik Mi ha aiutato e funziona come un fascino – ashokdy

5

Questa regex limiterà l'utente di inserire tre punti a indirizzo email (o un qualsiasi numero di punti consecutivi), ad esempio

[email protected] 

Un'altra regola con Dot è il nome utente e dominio non deve iniziare o terminare con punti, come ad esempio

[email protected] 

Molte espressioni regolari in internet permettono di indirizzi email non validi. Prima di adottarne uno, potresti provare a testarlo con alcuni indirizzi email non validi, per vedere se vengono rifiutati. Puoi usare i due esempi che cito qui come inizio.

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

Vedere validate email address using regular expression in Objective-C.

+0

Grazie per questo, il tuo test 'regex1' mi ha salvato un sacco di problemi limitando più punti. Grazie ancora! – rosshump

3

IOS ha già incorporato rilevatori di dati per un certo numero di tipi di dati. Sebbene l'e-mail non sia uno di questi tipi, un indirizzo e-mail rientra nel sottotipo di un collegamento. Sapendo che, è facile verificare la presenza di un indirizzo email:

NSError *error = nil; 
NSDataDetector *detector = 
    [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]; 

NSString *string = @"[email protected]"; 
[detector enumerateMatchesInString:string 
          options:kNilOptions 
          range:NSMakeRange(0, [string length]) 
         usingBlock:^(NSTextCheckingResult *result, 
            NSMatchingFlags flags, BOOL *stop) 
{ 
    if([result.URL.absoluteString rangeOfString:@"mailto:"].location != NSNotFound) 
    { 
    NSLog(@"Match: %@", result); 
    } 
}]; 

blog NSHipster di Matt Thompson ha un excellent article su NSDataDetector e la sua useage.

0

sulla base memmons 'answer, il seguente codice dovrebbe convalidare un intera stringa email assumendo possiamo fidarci NSDataDetector

- (BOOL)isPlausibleEmailAddress 
{ 
    NSError *error = nil; 
    NSDataDetector *detector = 
    [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error]; 

    NSRange matchRange = [detector rangeOfFirstMatchInString:self options:kNilOptions range:NSMakeRange(0, [self length])]; 

    return matchRange.length == [self length]; 
} 
0

è possibile farlo utilizzando l'estensione di String

extension String { 
    var isEmail: Bool { 
     let emailRegEx = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" 
     let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
     return emailTest.evaluate(with: self) 
    } 
} 

ora può essere utilizzato come

emailtext.isEmail { 

    print("email is valid")  
} else { 

print("email is not valid") 
}