iOS 2.0에서 사용자가 입력 한 이메일 주소를 확인하는 가장 확실한 방법은 무엇입니까?
참고 : 이것은 iOS 2.0에만 해당되는 역사적 질문이며 그 연령과 그에 연결된 다른 질문 수로 인해 폐기 할 수 없으며 "현대적인"질문으로 변경해서는 안됩니다.
NSDataDetector
하여 이메일 주소를 확인 하는 답변을 추가했습니다 . stackoverflow.com/a/23547905/257550
iOS 2.0에서 사용자가 입력 한 이메일 주소를 확인하는 가장 확실한 방법은 무엇입니까?
참고 : 이것은 iOS 2.0에만 해당되는 역사적 질문이며 그 연령과 그에 연결된 다른 질문 수로 인해 폐기 할 수 없으며 "현대적인"질문으로 변경해서는 안됩니다.
NSDataDetector
하여 이메일 주소를 확인 하는 답변을 추가했습니다 . stackoverflow.com/a/23547905/257550
답변:
정규식 을 사용하여 전자 메일 주소 확인에 대한 답변 은 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 /; 비 공백 컨트롤 % d33-90 /; US-ASCII의 나머지 % d94-126; "["를 포함하지 않는 문자, ; "]"또는 "\"
예, +, '등이 모두 합법적임을 의미합니다.
지금까지 내가 찾은 가장 좋은 해결책은 NSString 카테고리를 통해 정규 표현식에 액세스 할 수있는 프로젝트 에 RegexKitLite 를 추가하는 것입니다 .
프로젝트에 추가하는 것은 상당히 고통스럽지 않으며 일단 정규식 이메일 유효성 검사 논리가 작동합니다.
좋은 시작은 당신이 무엇을 결정하고 이메일 주소로 수락하고 싶지 않습니까?
이메일 주소의 99 %는 다음과 같습니다 : bob.smith@foo.com 또는 fred@bla.edu
그러나 다음과 같은 이메일 주소를 갖는 것은 기술적으로 합법적입니다. f !#$%&'*+-/=?^_
{|} ~ "ha!"@ com
세계에는 최상위 도메인에 대한 소수의 유효한 전자 메일 만있을 수 있으며 거의 모든 다른 문자 (특히 따옴표 및 백틱)를 사용하는 사람이 거의 없으므로 이러한 전자 메일이 모두 잘못된 것으로 가정 할 수 있습니다. 그러나 당신은 의식적인 결정으로 그렇게해야합니다.
그 외에도 Paul의 말을 수행하고 입력을 다음과 같은 정규식과 일치 시키십시오. ^ [A-Z0-9 ._ % +-] + @ [A-Z0-9 .-] +. [AZ] { 2,} $
그것은 거의 모든 사람의 이메일 주소와 일치 할 것입니다.
이 기능은 간단하지만 이메일 주소를보다 철저하게 확인합니다. 예를 들어, RFC2822에 따르면 이메일 주소에는 firstname..lastname @ domain..com과 같이 두 개의 마침표가 한 행에 포함되어서는 안됩니다.
이 함수에서 볼 수 있듯이 정규식에 앵커를 사용하는 것도 중요합니다. 앵커가 없으면 다음 이메일 주소가 유효한 것으로 간주됩니다. first; name) last @@ domain.com (blah 는 lastname@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에서 정규 표현식을 사용하여 이메일 주소 확인을 참조하십시오. .
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 를 우연히 발견했습니다 .
많은 웹 사이트에서 RegEx를 제공하지만이를 배우고 이해하고 원하는 것이 전자 메일 주소 형식에 대한 공식 RFC 내 요구 사항을 충족하는지 확인하는 것이 좋습니다.
RegEx를 배우기 위해 해석되는 언어는 훌륭한 단순화와 테스트 베드가 될 수 있습니다. 루블라는 루비를 기반으로하지만 http://www.rubular.com/ 을 테스트하고 확인하는 좋은 방법입니다 .
그 외에도 최신 버전의 O'Reilly 책 Mastering Regular Expressions를 구입하십시오. 첫 3 장 또는 4 장을 이해하기 위해 시간을 보내고 싶을 것입니다. 그 이후의 모든 것은 고도로 최적화 된 RegEx 사용에 대한 전문 지식을 구축하는 것입니다.
더 작고 관리하기 쉬운 일련의 RegEx를 유지 관리하고 디버깅하기가 더 쉽습니다.
다음은 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에
정규식을 사용하여 이메일의 유효성을 검사해서는 안됩니다. 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)"
}
}
validate email objective-c
인 경우이 질문이 세 번째 결과입니다. 인터넷의 일부는 노화되지 않습니다. :-)
NSDataDetector
iOS 2.0에는 존재하지 않았습니다.이 질문에 관한 것입니다.
// 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;
}
NSPredicate
iOS 2 용입니다. iOS 2에는 존재하지 않았습니다. 그것은 아이폰 OS 3까지 추가 할 수 없습니다