Thực tiễn tốt nhất để xác thực địa chỉ email trên iOS 2.0 là gì


167

Cách sạch nhất để xác thực địa chỉ email mà người dùng nhập trên iOS 2.0 là gì?

LƯU Ý : Đây là một câu hỏi lịch sử dành riêng cho iOS 2.0 và do tuổi của nó và có bao nhiêu câu hỏi khác được liên kết với nó nên không thể bỏ qua và KHÔNG PHẢI thay đổi thành câu hỏi "hiện đại".


Tôi đang tìm kiếm một giải pháp ca cao. Tôi hiểu tính hợp lệ của email và các quy tắc xung quanh việc xác thực email. Tuy nhiên, vì RegEx không dễ truy cập trên Cốc Cốc, tôi đang tìm kiếm một giải pháp Cacao Touch để xác thực. Không phải là một danh sách các quy tắc xung quanh xác nhận.
Marcus S. Zarra

Cho đến nay, đề xuất mã tốt nhất mà tôi đã tìm thấy là sử dụng RegExKitLite và các biểu thức thông thường. May mắn là nó ít đau đớn hơn âm thanh.
Marcus S. Zarra

Xem bình luận bên dưới về việc sử dụng NSRegularExpression cho các ứng dụng không hỗ trợ os <4.0.
beOn

1
Vì đây có vẻ là câu hỏi kinh điển liên quan đến xác thực địa chỉ email, nên cập nhật với các câu trả lời được cải thiện khi đáo hạn iOS. Với ý nghĩ đó, tôi đã thêm một câu trả lời sử dụng iOS NSDataDetectorđể xác thực địa chỉ email: stackoverflow.com/a/23547905/257550
memmons

2
Câu hỏi này dường như lạc đề vì đó là về iOS 2.0 đã bị từ chối nhiều năm trước.
Nathan Eror

Câu trả lời:


354

Câu trả lời cho việc sử dụng biểu thức chính quy để xác thực địa chỉ email giải thích rất chi tiết rằng ngữ pháp được chỉ định trong RFC 5322 quá phức tạp đối với các biểu thức chính quy nguyên thủy.

Tôi khuyên bạn nên một cách tiếp cận trình phân tích cú pháp thực sự như MKEmailAddress .

Khi giải pháp biểu thức chính quy nhanh chóng thấy điều chỉnh này của DHValidation :

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex =
@"(?:[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 *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}

9
Tuyệt vời nhưng không hoạt động trên HĐH <3.0, vì NSPredicate không khả dụng.
Felixyz

4
Đẹp. Mọi người đều quên rằng NSPredicate có thể chạy regexps.
Rog

5
Đó là một regrec rất xấu. Chẳng hạn, nó sẽ thất bại với những người sử dụng tên miền .museum hàng đầu. Tham khảo bài viết này: linuxjournal.com/article/9585
Jonny

18
Có một regex hoàn chỉnh hơn tại cocoawithlove.com/2009/06/ Khăn có thể được sử dụng thay vì đơn giản này.
Tomas Andrle

12
Đây là một regex email rất ngây thơ nhưng tự do như một chuỗi Ca cao: @"[^@]+@[^.@]+(\\.[^.@]+)+"Nếu bạn cần xác minh một địa chỉ email, hãy gửi một tin nhắn đến nó và xem nếu nó thành công. Bạn sẽ không bao giờ xác minh nó với bất kỳ mức độ chính xác nào chỉ với một biểu thức chính quy, vì vậy tốt nhất không nên chọc giận người dùng và mất đăng ký vì một biểu thức nghiêm ngặt không cần thiết.
Sami Samhuri

20

Đọc RFC. Hầu như tất cả mọi người nghĩ rằng họ biết cách phân tích / xóa / xác thực một địa chỉ email là sai.

http://tools.ietf.org/html/rfc2822 Mục 3.4.1 rất hữu ích. Để ý

dtext = NO-WS-CTL /; Điều khiển không gian trắng

                        % d33-90 /; Phần còn lại của US-ASCII
                        % d94-126; các ký tự không bao gồm "[",
                                        ; "]", hoặc là "\"

Vâng, điều đó có nghĩa là +, ', v.v ... đều hợp pháp.


Hiện tại kể từ tháng 5 năm 2016: RFC5322, phần 3.4.1
leanne

17

Giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay (và giải pháp mà tôi đã kết thúc) là thêm RegexKitLite vào dự án cho phép truy cập vào các biểu thức thông thường thông qua Danh mục NSString.

Việc thêm vào dự án là khá khó khăn và một khi đã có, bất kỳ logic xác thực email biểu thức chính quy nào cũng sẽ hoạt động.


5
NSPredicate có thể thực hiện RegEx mà không cần thêm thư viện bổ sung vào dự án của bạn.
BadPirate

10
Câu hỏi này, từ tháng 4 năm 2009 là trước khi NSPredicate tồn tại trên iOS.
Marcus S. Zarra

7
Một lần nữa, NSRegularExpression DID KHÔNG EXIST trong iOS 2.0 khi câu hỏi này được hỏi.
Marcus S. Zarra

9
@Marcus, quan điểm của Stack Overflow không phải là duy trì một hồ sơ lịch sử về cách giải quyết các vấn đề cụ thể trong quá khứ. Điều đó nói rằng, tôi đã chỉnh sửa câu hỏi của bạn để nhấn mạnh góc tương thích 2.0.
benzado

2
Vui lòng đọc tiêu đề, đây là phiên bản iOS 2.0 mà giải pháp của Catlan không tồn tại.
Marcus S. Zarra

10

Một khởi đầu tốt là quyết định những gì bạn và bạn không muốn chấp nhận như một địa chỉ email?

99% địa chỉ email trông như thế này: bob.smith@foo.com hoặc fred@bla.edu

Tuy nhiên, về mặt kỹ thuật có một địa chỉ email như thế này: f !#$%&'*+-/=?^_{|} ~ "ha!" @ Com

Có lẽ chỉ có một số email hợp lệ trên thế giới cho các tên miền cấp cao nhất và hầu như không ai sử dụng hầu hết các ký tự khác (đặc biệt là trích dẫn và backticks), vì vậy bạn có thể muốn cho rằng đây là tất cả những việc không hợp lệ. Nhưng bạn nên làm như vậy là một quyết định có ý thức.

Ngoài ra, hãy làm những gì Paul nói và cố gắng khớp đầu vào với một biểu thức chính quy như thế này: ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [AZ] { 2,} $

Cái đó sẽ khớp với khá nhiều địa chỉ email của mọi người.


mặc dù câu trả lời này được viết vào năm 2009 nhưng nó vẫn đạt kết quả tìm kiếm rất cao. tôi chỉ muốn thêm rằng điều này không còn cập nhật nữa và regex ở trên có một chút hạn chế. ví dụ: bây giờ bạn có thể có tên miền cấp cao nhất gồm 4 chữ số trở lên
Jack

Điểm hay, chỉnh sửa nó thành "ít nhất 2 chữ số". Hãy chỉnh sửa thêm nếu bạn muốn.
Brandon Yarbrough

7

Mặc dù tập trung vào các biểu thức thông thường là tốt, nhưng đây chỉ là bước đầu tiên và cần thiết. Có những bước khác cũng cần được tính cho một chiến lược xác nhận tốt.

Hai thứ trên đầu tôi là:

  1. Xác thực DNS để đảm bảo tên miền thực sự tồn tại.

  2. Sau khi xác thực dns, bạn cũng có thể chọn thực hiện xác thực smtp. gửi một cuộc gọi đến máy chủ smtp để xem người dùng có thực sự tồn tại không.

Bằng cách này, bạn có thể bắt được tất cả các loại lỗi người dùng và đảm bảo đó là một email hợp lệ.


7

Chức năng này đơn giản và kiểm tra địa chỉ email kỹ lưỡng hơn. Ví dụ: theo RFC2822, một địa chỉ email không được chứa hai dấu chấm liên tiếp, chẳng hạn như Firstname..lastname @ domain..com

Nó cũng quan trọng để sử dụng các neo trong các biểu thức thông thường như được thấy trong hàm này. Không có neo, địa chỉ email sau được coi là hợp lệ: đầu tiên, tên) lastname@domain.com (blah vì phần lastname@domain.com là hợp lệ, bỏ qua đầu tiên; tên) ở đầu và (blah ở cuối. công cụ biểu thức chính quy để xác nhận toàn bộ email.

Chức năng này sử dụng NSPredicate không tồn tại trong iOS 2. Thật không may, nó có thể không giúp được người hỏi, nhưng hy vọng sẽ giúp những người khác với các phiên bản iOS mới hơn. Các biểu thức chính quy trong chức năng này vẫn có thể được áp dụng cho RegExKitLite trong iOS 2. Và đối với những người sử dụng iOS 4 trở lên, những biểu thức thông thường này có thể được triển khai với NSRegularExpression.

- (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 địa chỉ email xác thực bằng biểu thức chính quy trong Objective-C .


iOS 2.0 không có NSPredicate.
Marcus S. Zarra

2
Nhưng công dụng của câu hỏi này là gì và công dụng của ios 2. Chúng ta đang có hệ điều hành mới nhất đó là ios 7.1. bạn cũng có thể sử dụng ios 6.
Gaurav Gilani

6
NSString *emailString = textField.text; **// storing the entered email in a string.** 
**// Regular expression to checl the email format.** 
NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; 
if (([emailTest evaluateWithObject:emailString] != YES) || [emailStringisEqualToString:@""]) 
{ 
UIAlertView *loginalert = [[UIAlertView alloc] initWithTitle:@" Enter Email in" message:@"abc@example.com format" delegate:self 
cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

enter code here

[loginalert show]; 
[loginalert release]; 
} 
If email is invalid, it will remind the user with an alert box. 
Hope this might be helpful for you all. 

4

Tôi đã thấy rằng việc sử dụng một biểu thức chính quy hoạt động khá tốt để xác thực một địa chỉ email.

Nhược điểm chính của các biểu thức thông thường tất nhiên là khả năng duy trì, vì vậy nhận xét như bạn chưa bao giờ nhận xét trước đây. Tôi hứa với bạn, nếu bạn không, bạn sẽ ước bạn đã làm như vậy khi bạn quay lại biểu hiện sau một vài tuần.

Đây là một liên kết đến một nguồn tốt, http://www.THER-expressions.info/email.html .


Tôi đã triển khai cái thứ hai cuối cùng trên trang đó gần đây và tôi khá hài lòng với nó. Nó hoạt động tốt đối với một địa chỉ email user@host.com đơn giản, không có dấu ngoặc kép hoặc dấu ngoặc cho tên đầy đủ. Hoạt động tuyệt vời để xác thực mẫu web nơi mọi người sẽ không gõ loại đó vào bất cứ điều gì.
zombat

2
Những người nghèo với .museum TLD của họ.
BadPirate

3

Đào đất, nhưng tôi tình cờ thấy SHEmailValidator , một công việc hoàn hảo và có giao diện đẹp.


Câu hỏi này dành riêng cho iOS 2.0 không có NSPredicate hoặc toàn bộ các thứ khác đang được sử dụng trong thư viện đó.
Marcus S. Zarra

1
Tôi biết, nhưng tôi đã đến đây trước khi tìm kiếm "xác thực email ios". Có thể một số tương lai tôi sẽ thực hiện cùng một tìm kiếm và hạ cánh ở đây và nó sẽ giúp anh ta tiết kiệm thời gian.
Cyrille

1

Nhiều trang web cung cấp RegExes nhưng bạn sẽ học tốt và hiểu chúng cũng như xác minh rằng những gì bạn muốn nó đáp ứng nhu cầu của bạn trong RFC chính thức cho các định dạng địa chỉ email.

Đối với việc học RegEx, các ngôn ngữ được dịch có thể là một trình mô phỏng và thử nghiệm tuyệt vời. Rubular được xây dựng trên Ruby, nhưng là một cách nhanh chóng để kiểm tra và xác minh: http://www.rubular.com/

Ngoài ra, hãy mua phiên bản mới nhất của cuốn sách O'Reilly Làm chủ các biểu thức chính quy. Bạn sẽ muốn dành thời gian để hiểu 3 hoặc 4 chương đầu tiên. Mọi thứ sau đó sẽ được xây dựng chuyên môn về việc sử dụng RegEx được tối ưu hóa cao.

Thông thường, một loạt các RegExes nhỏ hơn, dễ quản lý hơn sẽ dễ bảo trì và gỡ lỗi hơn.


0

Đây là phần mở rộng của String xác thực email trong Swift.

extension String {

    func isValidEmail() -> Bool {
        let stricterFilter = false
        let stricterFilterString = "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"
        let laxString = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
        let emailRegex = stricterFilter ? stricterFilterString : laxString
        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailTest.evaluate(with: self)
    }
}

Sao chép từ câu trả lời đến: Kiểm tra xem địa chỉ email có hợp lệ trên iOS không


Không có NSPredicatetrên iOS 2.0
Marcus S. Zarra

-2

Bạn không nên cố gắng sử dụng regex để xác thực email. Với các TLD luôn thay đổi, trình xác nhận của bạn không đầy đủ hoặc không chính xác. Thay vào đó, bạn nên tận dụng NSDataDetectorcác thư viện của Apple sẽ lấy một chuỗi và thử xem liệu có bất kỳ trường dữ liệu đã biết nào không (email, địa chỉ, ngày, v.v.). SDK của Apple sẽ thực hiện rất nhiều việc cập nhật các TLD và bạn có thể giảm bớt những nỗ lực của họ !! :)

Ngoài ra, nếu iMessage (hoặc bất kỳ trường văn bản nào khác) không nghĩ đó là email, bạn có nên xem xét email không?

Tôi đặt chức năng này trong một NSStringdanh mục, vì vậy chuỗi bạn đang kiểm tra là self.

- (BOOL)isValidEmail {
    // Trim whitespace first
    NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
    if (self && self.length > 0) return NO;

    NSError *error = nil;
    NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
    if (!dataDetector) return NO;

    // This string is a valid email only if iOS detects a mailto link out of the full string
    NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
    if (error) return NO;
    return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
}

hoặc như một Stringphần mở rộng nhanh chóng

extension String {
    func isValidEmail() -> Bool {
        let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
        guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
            return false
        }
        let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))

        return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
    }
}

1
Câu hỏi này là từ EIGHT năm trước.
Marcus S. Zarra

1
Tuy nhiên, nếu bạn Google validate email objective-c, câu hỏi này là kết quả thứ ba. Một số điều trên internet không tuổi. :-)
Craig Otis

1
Vui lòng dừng liên kết spam đến câu trả lời này bên dưới mỗi bài đăng bạn có thể thấy có liên quan đến việc xác thực địa chỉ email. Nhận xét là để yêu cầu làm rõ, không phải để spam liên kết đến câu trả lời của bạn.
meagar

BTW, NSDataDetectorKHÔNG tồn tại trong iOS 2.0, đó là những gì câu hỏi này đã / đang nói về.
Marcus S. Zarra

-7
// Method Call
NSString *email = @"Your Email string..";

BOOL temp = [self validateEmail:email];

if(temp)
{
// Valid
}
else
{
// Not Valid
}
// Method description

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

3
Chủ đề / câu hỏi này dành cho iOS 2. NSPredicatekhông tồn tại trong iOS 2; nó không được thêm cho đến iOS 3.
Marcus S. Zarra

3
Tôi trả lời vì câu trả lời của bạn sai. Câu hỏi là "bạn làm X trên iOS Y như thế nào" và bạn đã trả lời với một khung không tồn tại trên phiên bản iOS đó.
Marcus S. Zarra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.