2012-02-16 16 views
11

Estoy tratando de poner la validación en el campo de texto que contiene la dirección de correo electrónico.
Lo que se debe agregar en la cadena "emailRegEx" para limitar al usuario de insertar tres puntos en la dirección de correo electrónico o lo que tengo que escribir en el método para el mismo.Validar la dirección de correo electrónico en UITextField

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

Aquí está mi código:

- (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

posible dupl ¿Cuál es el nombre de [Mejores prácticas para validar la dirección de correo electrónico en Objective-C en iOS 2.0?] (http://stackoverflow.com/questions/800123/best-practices-for-validating-email-address-in-objective-c-on -ios-2-0) – zpasternack

+0

@zpasternack: quiero validar dinámicamente, ese usuario no debe ingresar el tercer punto. Si ingresa, reemplácelo por una cadena nula.El método anterior está validado en ShouldEndEditing-method – Ketan

+0

Ahora que tenemos nombres de dominio UTF-8, ¿cómo cambia esto estas expresiones regulares? p.ej. camtasia 教程 网 .com –

Respuesta

17

Hay mejores ways para validar una dirección de correo electrónico.

- (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

quiero validar dinámicamente, ese usuario no debe ingresar el tercer punto. si entra entonces lo reemplaza por una cadena nula, el método Above está validando en ShouldEndEditing-method – 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 Me ayudó y funcionó como un encanto – ashokdy

5

Esta expresión regular limitará al usuario de la inserción de tres puntos en la dirección de correo electrónico (o cualquier número de puntos consecutivos), como

[email protected] 

Otra regla con el punto es el nombre de usuario y dominio no debe comenzar o terminar con el punto, como

[email protected] 

Muchas expresiones regulares en internet permiten que las direcciones de correo electrónico válida. Antes de adoptar uno, es posible que desee intentar probarlo con algunas direcciones de correo electrónico no válidas, para ver si se rechazan. Puede usar los dos ejemplos que menciono aquí como un comienzo.

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

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

+0

Gracias por esto, tu prueba 'regex1' me ahorró mucha molestia al limitar varios puntos. ¡Gracias de nuevo! – rosshump

3

iOS ya tiene detectores de datos incorporados para diferentes tipos de datos. Aunque el correo electrónico no es uno de esos tipos, una dirección de correo electrónico se clasifica en el subtipo de un enlace. Sabiendo eso, es fácil comprobar una dirección de correo electrónico:

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

NSString *string = @"[email protected]com"; 
[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); 
    } 
}]; 

el blog NSHipster de Matt Thompson tiene un excellent article en NSDataDetector y su Useage.

0

basándose en memmons 'answer, el siguiente código debe validar una cadena de correo electrónico completa suponiendo que podemos confiar en 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

puede hacerlo mediante el uso de la extensión de la cadena

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

ahora puede usarlo como

emailtext.isEmail { 

    print("email is valid")  
} else { 

print("email is not valid") 
} 
Cuestiones relacionadas