2012-02-16 41 views
11

Tôi đang cố gắng xác thực trong trường văn bản chứa địa chỉ email.
Điều gì sẽ được thêm vào trong chuỗi "emailRegEx" để hạn chế người dùng chèn ba dấu chấm vào địa chỉ email hoặc những gì tôi phải viết trong phương thức cho cùng.Xác thực địa chỉ email trong UITextField

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

Đây là mã của tôi:

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

dupl có thể icate of [Các phương pháp hay nhất để xác thực địa chỉ email trong Objective-C trên iOS 2.0?] (http://stackoverflow.com/questions/800123/best-practices-for-validating-email-address-in-objective-c-on -ios-2-0) – zpasternack

+0

@zpasternack: tôi muốn xác thực động, người dùng đó không nên nhập dấu chấm thứ ba.if nó vào rồi thay thế bằng chuỗi rỗng.Phương thức trên được xác nhận trong phương thức ShouldEndEditing- – Ketan

+0

Bây giờ chúng ta có các tên miền UTF-8, làm thế nào để thay đổi các biểu thức chính quy này? ví dụ. camtasia 教程 网 .com –

Trả lời

17

Có tốt hơn ways để xác nhận địa chỉ email.

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

tôi muốn xác thực động, người dùng không nên nhập dấu chấm thứ ba.if nó vào rồi thay thế bằng chuỗi rỗng, Phương thức trên được xác thực trong phương pháp 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 Nó đã giúp tôi và làm việc như một nét duyên dáng – ashokdy

5

regex này sẽ hạn chế người sử dụng từ chèn ba chấm trong địa chỉ email (hoặc bất kỳ số lượng dấu chấm liên tiếp), chẳng hạn như

[email protected] 

Một quy tắc với dấu chấm là tên người dùng và miền không được bắt đầu hoặc kết thúc với dấu chấm, ví dụ như

[email protected] 

Nhiều regexes trên Internet cho phép các địa chỉ email không hợp lệ. Trước khi áp dụng, bạn có thể thử thử nghiệm một số địa chỉ email không hợp lệ để xem liệu chúng có bị từ chối hay không. Bạn có thể sử dụng hai ví dụ tôi đề cập ở đây như là một sự khởi đầu.

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

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

+0

Cảm ơn vì điều này, bài kiểm tra 'regex1' của bạn đã giúp tôi tiết kiệm rất nhiều rắc rối bằng cách giới hạn nhiều dấu chấm. Cảm ơn một lần nữa! – rosshump

3

iOS đã có trình phát hiện dữ liệu tích hợp cho một số loại dữ liệu khác nhau. Mặc dù email không phải là một trong các loại đó, địa chỉ email nằm trong loại phụ của một liên kết. Biết rằng, thật dễ dàng để kiểm tra một địa chỉ 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 của NSHipster Matt Thompson có một excellent article trên NSDataDetector và năng bảo mật bằng của nó.

0

xây dựng trên memmons 'answer, đoạn code sau nên xác nhận toàn bộ một chuỗi email giả sử chúng ta có thể tin tưởng 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

bạn có thể làm điều đó bằng cách sử dụng phần mở rộng của 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) 
    } 
} 

bây giờ bạn có thể sử dụng nó làm

emailtext.isEmail { 

    print("email is valid")  
} else { 

print("email is not valid") 
} 
Các vấn đề liên quan