iOS 2.0에서 이메일 주소를 확인하는 모범 사례는 무엇입니까


167

iOS 2.0에서 사용자가 입력 한 이메일 주소를 확인하는 가장 확실한 방법은 무엇입니까?

참고 : 이것은 iOS 2.0에만 해당되는 역사적 질문이며 그 연령과 그에 연결된 다른 질문 수로 인해 폐기 할 수 없으며 "현대적인"질문으로 변경해서는 안됩니다.


코코아 솔루션을 찾고 있습니다. 이메일의 유효성과 이메일 유효성 검사 규칙을 이해합니다. 그러나 Cocoa Touch에서 RegEx에 쉽게 액세스 할 수 없으므로 유효성 검사를위한 Cocoa Touch 솔루션을 찾고 있습니다. 유효성 검사와 관련된 규칙 목록이 없습니다.
Marcus S. Zarra

지금까지 내가 찾은 최고의 코드 제안은 RegExKitLite 및 정규 표현식을 사용하는 것입니다. 다행히도 그것은 소리보다 덜 고통 스럽습니다.
Marcus S. Zarra

os <4.0을 지원하지 않는 앱에 NSRegularExpression을 사용하는 방법에 대해서는 아래 주석을 참조하십시오.
BEON

1
이메일 주소 확인과 관련하여 일반적인 질문 인 것 같으므로 iOS가 성숙함에 따라 개선 된 답변으로 업데이트하는 것이 좋습니다. 이를 염두에두고, iOS를 사용 NSDataDetector하여 이메일 주소를 확인 하는 답변을 추가했습니다 . stackoverflow.com/a/23547905/257550
memmons

2
이 질문은 몇 년 전에 더 이상 사용되지 않는 iOS 2.0에 관한 것이므로 주제가 아닌 것 같습니다.
Nathan Eror

답변:


354

정규식사용하여 전자 메일 주소 확인에 대한 답변 은 RFC 5322에 지정된 문법이 기본 정규식에 비해 너무 복잡하다는 것을 자세하게 설명합니다.

MKEmailAddress 와 같은 실제 파서 접근 방식을 권장합니다 .

빠른 정규식 솔루션으로 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
NSPredicate를 사용할 수 없으므로 OS <3.0에서는 훌륭하지만 작동하지 않습니다.
Felixyz

4
좋은. NSPredicate가 정규 표현식을 실행할 수 있다는 것을 잊어 버립니다.
Rog

5
그것은 매우 나쁜 정규 표현식입니다. 예를 들어 .museum 최상위 도메인을 사용하는 사람들에게는 실패합니다. 이 기사를 참조하십시오 : linuxjournal.com/article/9585
Jonny

18
cocoawithlove.com/2009/06/… 에는 더 간단한 정규식이 있는데이 간단한 대신 사용할 수 있습니다.
Tomas Andrle

12
코코아 문자열로 매우 순진하지만 자유로운 전자 메일 정규식은 다음과 같습니다 @"[^@]+@[^.@]+(\\.[^.@]+)+". 전자 메일 주소를 확인해야 할 경우 메시지를 보내고 성공했는지 확인하십시오. 정규 표현식만으로는 어떤 수준의 정확성으로도 검증하지 않으므로 불필요하게 엄격한 정규 표현식으로 인해 사용자를 화나게하고 가입을 잃지 않는 것이 가장 좋습니다.
Sami Samhuri

20

RFC를 읽으십시오. 이메일 주소를 파싱 / 청소 / 확인하는 방법을 알고 있다고 생각하는 사람들은 거의 모두 잘못되었습니다.

http://tools.ietf.org/html/rfc2822 섹션 3.4.1은 매우 유용합니다. 주의

dtext = NO-WS-CTL /; 비 공백 컨트롤

                        % d33-90 /; US-ASCII의 나머지
                        % d94-126; "["를 포함하지 않는 문자,
                                        ; "]"또는 "\"

예, +, '등이 모두 합법적임을 의미합니다.


2016 년 5 월 현재 : RFC5322, 섹션 3.4.1
leanne

17

지금까지 내가 찾은 가장 좋은 해결책은 NSString 카테고리를 통해 정규 표현식에 액세스 할 수있는 프로젝트 에 RegexKitLite 를 추가하는 것입니다 .

프로젝트에 추가하는 것은 상당히 고통스럽지 않으며 일단 정규식 이메일 유효성 검사 논리가 작동합니다.


5
NSPredicate는 프로젝트에 라이브러리를 추가하지 않고도 RegEx를 수행 할 수 있습니다.
BadPirate

10
이 질문은 2009 년 4 월부터 NSPredicate가 iOS에 존재하기 전에있었습니다.
Marcus S. Zarra

7
이 질문을 할 때 iOS 2.0에서 NSRegularExpression이 존재하지 않습니다 .
Marcus S. Zarra

9
@Marcus, Stack Overflow의 요점은 과거에 특정 문제가 어떻게 해결되었는지에 대한 기록을 유지하는 것이 아닙니다. 즉, 2.0 호환성 각도를 강조하기 위해 귀하의 질문을 편집했습니다.
벤 자도

2
제목을 읽으십시오. 이는 Catlan의 솔루션이 존재하지 않는 iOS 2.0 용입니다.
Marcus S. Zarra

10

좋은 시작은 당신이 무엇을 결정하고 이메일 주소로 수락하고 싶지 않습니까?

이메일 주소의 99 %는 다음과 같습니다 : bob.smith@foo.com 또는 fred@bla.edu

그러나 다음과 같은 이메일 주소를 갖는 것은 기술적으로 합법적입니다. f !#$%&'*+-/=?^_{|} ~ "ha!"@ com

세계에는 최상위 도메인에 대한 소수의 유효한 전자 메일 만있을 수 있으며 거의 ​​모든 다른 문자 (특히 따옴표 및 백틱)를 사용하는 사람이 거의 없으므로 이러한 전자 메일이 모두 잘못된 것으로 가정 할 수 있습니다. 그러나 당신은 의식적인 결정으로 그렇게해야합니다.

그 외에도 Paul의 말을 수행하고 입력을 다음과 같은 정규식과 일치 시키십시오. ^ [A-Z0-9 ._ % +-] + @ [A-Z0-9 .-] +. [AZ] { 2,} $

그것은 거의 모든 사람의 이메일 주소와 일치 할 것입니다.


이 답변은 2009 년에 작성되었지만 검색 결과에서 여전히 매우 높습니다. 나는 이것이 더 이상 최신이 아니며 위의 정규 표현식이 약간 제한적이라고 덧붙이고 싶었습니다. 예를 들어, 이제 4 자리 이상의 최상위 도메인을 가질 수 있습니다
Jack

좋은 점은 "2 자리 이상"으로 편집 한 것입니다. 원한다면 추가로 자유롭게 편집하십시오.
Brandon Yarbrough

7

정규 표현식에 중점을 두는 것이 좋지만 이것은 첫 번째 단계이며 필요한 단계입니다. 좋은 유효성 검사 전략을 위해 고려해야 할 다른 단계도 있습니다.

내 머리 위에 두 가지가 있습니다.

  1. 도메인이 실제로 존재하는지 확인하는 DNS 유효성 검사

  2. dns 유효성 검사 후 smtp 유효성 검사를 수행하도록 선택할 수도 있습니다. smtp 서버로 전화를 보내 사용자가 실제로 있는지 확인하십시오.

이런 식으로 모든 종류의 사용자 오류를 포착하고 유효한 전자 메일인지 확인할 수 있습니다.


7

이 기능은 간단하지만 이메일 주소를보다 철저하게 확인합니다. 예를 들어, RFC2822에 따르면 이메일 주소에는 firstname..lastname @ domain..com과 같이 두 개의 마침표가 한 행에 포함되어서는 안됩니다.

이 함수에서 볼 수 있듯이 정규식에 앵커를 사용하는 것도 중요합니다. 앵커가 없으면 다음 이메일 주소가 유효한 것으로 간주됩니다. first; name) last @@ domain.com (blahlastname@domain.com 섹션이 유효 하기 때문에 처음에는 name; name) 을 무시 하고 끝에는 blah 를 강제합니다. 앵커는 전체 표현식을 검증하는 정규식 엔진.

이 함수는 iOS 2에는 존재하지 않는 NSPredicate를 사용합니다. 불행히도 asker는 도움이되지 않지만 다른 버전의 iOS에서는 다른 사람들을 도울 것입니다. 이 함수의 정규 표현식은 여전히 ​​iOS 2의 RegExKitLite에 적용될 수 있습니다. 그리고 iOS 4 이상을 사용하는 사람들을 위해 이러한 정규 표현식은 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];
}

Objective-C에서 정규 표현식을 사용하여 이메일 주소 확인을 참조하십시오. .


iOS 2.0에는 NSPredicate가 없습니다.
Marcus S. Zarra

2
그러나이 질문의 사용법과 iOS 2의 사용법은 무엇입니까? 우리는 iOS 7.1 인 최신 OS를 사용하고 있습니다. 당신은 또한 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

정규식을 사용하면 전자 메일 주소의 유효성을 검사하는 데 매우 효과적이라는 것을 알았습니다.

물론 정규 표현식의 주요 단점은 유지 관리 가능성이므로 이전에 언급하지 않은 것처럼 의견을 말하십시오. 약속하지 않으면 몇 주 후에 그 표현으로 돌아갈 때 당신이 그랬 으면 좋겠다고 약속합니다.

다음은 좋은 소스 인 http://www.regular-expressions.info/email.html에 대한 링크 입니다.


최근에 해당 페이지에서 두 번째로 마지막을 구현했으며 매우 만족합니다. 이름이 따옴표 나 괄호없이 간단한 user@host.com 전자 메일 주소에 적합합니다. 사람들이 어쨌든 그런 종류의 것을 입력하지 않는 웹 양식 유효성 검사에 적합합니다.
zombat

2
.museum TLD를 가진 가난한 사람들.
BadPirate

3

더러움을 파기 시작했지만 SHEmailValidator 를 우연히 발견했습니다 .


이 질문은 NSPredicate 또는 해당 라이브러리에서 사용되는 다른 모든 호스트가없는 iOS 2.0에만 해당됩니다.
Marcus S. Zarra

1
알고 있지만 "ios email validation"을 검색하는 동안 여기에 처음 방문했습니다. 어쩌면 미래에 같은 검색을 수행하고 시간을 절약 할 수 있습니다.
Cyrille

1

많은 웹 사이트에서 RegEx를 제공하지만이를 배우고 이해하고 원하는 것이 전자 메일 주소 형식에 대한 공식 RFC 내 요구 사항을 충족하는지 확인하는 것이 좋습니다.

RegEx를 배우기 위해 해석되는 언어는 훌륭한 단순화와 테스트 베드가 될 수 있습니다. 루블라는 루비를 기반으로하지만 http://www.rubular.com/ 을 테스트하고 확인하는 좋은 방법입니다 .

그 외에도 최신 버전의 O'Reilly 책 Mastering Regular Expressions를 구입하십시오. 첫 3 장 또는 4 장을 이해하기 위해 시간을 보내고 싶을 것입니다. 그 이후의 모든 것은 고도로 최적화 된 RegEx 사용에 대한 전문 지식을 구축하는 것입니다.

더 작고 관리하기 쉬운 일련의 RegEx를 유지 관리하고 디버깅하기가 더 쉽습니다.


0

다음은 Swift에서 이메일을 확인하는 String의 확장입니다.

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

답변에서 복사 : iOS에서 이메일 주소가 유효한지 확인


더 없었다 NSPredicate아이폰 OS 2.0에
마커스 S. Zarra

-2

정규식을 사용하여 이메일의 유효성을 검사해서는 안됩니다. TLD를 계속 변경하면 유효성 검사기가 불완전하거나 정확하지 않습니다. 대신, Apple의 NSDataDetector라이브러리를 활용 하여 문자열을 가져와 알려진 데이터 필드 (이메일, 주소, 날짜 등)가 있는지 확인해야합니다. Apple의 SDK는 TLD를 최신 상태로 유지하는 데 많은 노력을 기울일 것이며 그들의 노력을 피할 수 있습니다! :)

또한 iMessage (또는 다른 텍스트 필드)가 이메일이라고 생각하지 않는다면 이메일을 고려해야합니까?

이 함수를 NSString범주 에 넣었 으므로 테스트중인 문자열은 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]]);
}

또는 신속한 String확장으로

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
이 질문은 8 년 전의 것입니다.
Marcus S. Zarra

1
그러나 Google validate email objective-c인 경우이 질문이 세 번째 결과입니다. 인터넷의 일부는 노화되지 않습니다. :-)
Craig Otis

1
이메일 주소 확인과 관련된 모든 게시물 아래에서이 답변에 대한 스팸 링크를 중지하십시오. 의견은 답변을 스팸으로 보내는 링크가 아니라 설명을 요청하기위한 것입니다.
meagar

BTW, NSDataDetectoriOS 2.0에는 존재하지 않았습니다.이 질문에 관한 것입니다.
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
이 스레드 / 질문은 NSPredicateiOS 2 용입니다. iOS 2에는 존재하지 않았습니다. 그것은 아이폰 OS 3까지 추가 할 수 없습니다
마커스 S. Zarra

3
당신의 대답이 틀 렸기 때문에 나는 대답했다. 문제는 "iOS Y에서 X를 어떻게합니까?"이며 해당 버전의 iOS에 존재하지 않는 프레임 워크로 답변했습니다.
Marcus S. Zarra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.