문제

무엇이 가장 깨끗한 방법으로 이메일 주소를 확인하는 사용자가 iOS2.0?

참고:이것은 역사적인 질문에 특정 iOS2.0 때문에 나이 얼마나 많은 다른 질문은 그것을 연결해할 수 없는 은퇴해야 합 변경되지 않는 질문입니다.

도움이 되었습니까?

해결책 3

내가 지금까지 찾은 최선의 솔루션 (그리고 내가 끝나게 된 것)은 추가하는 것입니다. Regexkitlite NSSTRING 카테고리를 통해 정규 표현식에 액세스 할 수있는 프로젝트에.

프로젝트에 추가하는 것은 매우 고통스럽지 않으며 한 번 제자리에 정규 표현식 이메일 검증 로직이 작동합니다.

다른 팁

답변 정규 표현식을 사용하여 이메일 주소를 검증합니다 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];
}

RFC를 읽으십시오. 이메일 주소를 구문 분석/청소/검증하는 방법을 알고 있다고 생각하는 거의 모든 사람들이 잘못되었습니다.

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

dtext           =       NO-WS-CTL /     ; Non white space controls

                        %d33-90 /       ; The rest of the US-ASCII
                        %d94-126        ;  characters not including "[",
                                        ;  "]", or "\"

예, 그것은 +, '등이 모두 합법적이라는 것을 의미합니다.

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

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

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

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

그 외에도 바울이 말하는 것을하고 다음과 같은 정규 표현식에 입력을 일치 시키려고 노력합니다. 2,} $

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

정규 표현에 초점을 맞추는 것은 좋지만 이것은 첫 번째이며 필요한 단계 일뿐입니다. 좋은 검증 전략을 설명 해야하는 다른 단계가 있습니다.

내 머리 위에 두 가지가 다음과 같습니다.

  1. 도메인이 실제로 존재하는지 확인하기위한 DNS 검증.

  2. DNS 유효성 검사 후 SMTP 유효성 검사를 선택할 수도 있습니다. 사용자가 실제로 존재하는지 확인하려면 SMTP 서버에 전화를 보내십시오.

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

이 함수는 간단하고 아직 확인 이메일 주소하다.예를 들어,에 따라 RFC2822 이메일 주소 포함되지 않아야 합니다 두 기간에서와 같이 행 firstname..lastname@domain..com

그것은 또한 중요한 사용을 앵커에 정규 표현식에서 볼 수 있듯이 이 기능이 있습니다.없이 앵커는 다음과 같은 이메일 주소가 유효한 것으로 간주됩: 첫째,이름)lastname@domain.com(ㅋlastname@domain.com 섹션이 유효한 무시하고, 첫째,이름) 시작과 (ㅋ 니다.앵커 강제 정규 표현식 엔진을 확인하는 전체 이메일입니다.

이 기능을 사용하 NSPredicate 존재하지 않는 아이폰 os 에서 2.불행하게도 그것은 도움이되지 않을 수도 있습니 asker 지만 희망이 다른 사람을 도울 것이와 새로운 버전의합니다.정규 표현식을 이 함수에서 여전히 수용하 RegExKitLite 아이폰 os 에서 2 개의 하지만입니다.고 사용하는 사람들을 위해 iOS4 이상,이러한 정규 표현식을 구현할 수 있습니다 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];
}

이메일 주소 인증을 사용하여 정기적인 표현하는 것을 목적으 C.

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. 

정규 표현식을 사용하는 것이 이메일 주소를 검증하는 데 매우 효과적이라는 것을 알았습니다.

물론 정기적 인 표현의 주요 단점은 유지 가능성이므로 이전에 언급 한 적이없는 것처럼 의견을 제시하십시오. 나는 당신이하지 않으면 당신이 몇 주 후에 표현으로 돌아갈 때 당신이 원했을 것입니다.

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

흙을 파고 들지만 난 그냥 걸려 넘어 졌어 Shemailvalidator 완벽한 작업을 수행하고 멋진 인터페이스가 있습니다.

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

REGEX 학습의 경우 해석 된 언어는 훌륭한 단순화 및 테스트 베드가 될 수 있습니다. Rubular는 Ruby에 구축되었지만 테스트하고 확인하는 좋은 방법입니다.http://www.rubular.com/

그 외에도 O'Reilly Book Mastering 정규 표현의 최신판을 구입하십시오. 처음 3 ~ 4 장을 이해하기 위해 시간을 보내고 싶을 것입니다. 그 후 모든 것은 고도로 최적화 된 Regex 사용에 대한 전문 지식을 구축하는 것입니다.

종종 일련의 작고 쉽게 관리하기 쉬운 일련의 Regexes는 유지 관리 및 디버그가 더 쉽습니다.

다음은 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)
    }
}

답에서 복사 : 이메일 주소가 iOS에서 유효한지 확인하십시오

이메일을 확인하기 위해 Regex를 사용하려고하지 않아야합니다. TLD가 변경되면 유효성 검사기가 불완전하거나 부정확합니다. 대신, 당신은 애플을 활용해야합니다 NSDataDetector 문자열을 취하고 알려진 데이터 필드 (이메일, 주소, 날짜 등)가 있는지 확인하는 라이브러리. Apple의 SDK는 TLD로 최신 정보를 유지하는 데 많은 노력을 기울일 것이며 그들의 노력을 피할 수 있습니다 !! :)

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

이 기능을 a에 넣었습니다 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)"
    }
}
// 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top