Каковы рекомендации по проверке адресов электронной почты в iOS 2.0


каков самый чистый способ проверки адреса электронной почты, который пользователь вводит в iOS 2.0?

Примечание: это исторический вопрос, который специфичен для iOS 2.0, и из-за его возраста и того, сколько других вопросов связано с ним, он не может быть удален и не должен быть изменен на "современный" вопрос.

13 167

13 ответов:

ответ использование регулярного выражения для проверки адреса электронной почты очень подробно объясняет, что грамматика, указанная в 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 "\"

Да, это означает, что+, ' и т. д. все законны.

лучшее решение я нашел до сих пор (и я в конце) добавить RegexKitLite к проекту, который дает доступ к регулярным выражениям через категории NSString.

Это довольно безболезненно, чтобы добавить в проект и как только на месте, любой из регулярных выражений логики проверки электронной почты будет работать.

хорошее начало, чтобы решить, что вы и не хотите принять в качестве адреса электронной почты?

99% адресов электронной почты выглядят так: bob.smith@foo.com или fred@bla.edu

однако технически законно иметь такой адрес электронной почты: f!#$%&'*+-/=?^_{|}~"ха!"@com

в мире, вероятно, есть только несколько действительных писем для доменов верхнего уровня, и почти никто не использует большинство этих других символов( особенно кавычки и обратные кавычки), поэтому возможно, вы захотите предположить, что все это недопустимые вещи. Но вы должны сделать это как сознательное решение.

кроме того, сделайте то, что говорит Павел, и попытайтесь сопоставить входные данные с регулярным выражением следующим образом: ^[A-Z0-9._%+- ] + @[A-Z0-9.- ]+.[A-Z] {2,}$

что один будет соответствовать в значительной степени адрес электронной почты каждого.

пока фокус на регулярных выражениях хорош, но это только первый и необходимый шаг. Есть и другие шаги, которые также необходимо учитывать для хорошей стратегии проверки.

две вещи на моей голове:

  1. проверка DNS, чтобы убедиться, что домен действительно существует.

  2. после проверки dns Вы также можете выполнить проверку smtp. отправить запрос на SMTP-сервер увидеть, если пользователь на самом деле существует.

таким образом, вы можете поймать все виды ошибок пользователя и убедитесь, что это действительный адрес электронной почты.

эта функция проста и все же проверяет адрес электронной почты более тщательно. Например, согласно RFC2822 адрес электронной почты не должен содержать два периода подряд, например firstname..lastname@domain..com

также важно использовать якоря в регулярных выражениях, как показано в этой функции. Без Привязок допустимым считается следующий адрес электронной почты:first;name)lastname@domain.com (бла потому что lastname@domain.com раздел действителен, игнорирование первая;имя) в начале и (мля в конце. Якоря заставляют механизм регулярных выражений проверять всю электронную почту.

эта функция использует NSPredicate, который не существует в iOS 2. К сожалению, это может не помочь asker, но, надеюсь, поможет другим с более новыми версиями iOS. Регулярные выражения в этой функции все еще могут быть применены к RegExKitLite в iOS 2. И для тех, кто использует 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 что делает идеальную работу и имеет приятный интерфейс.

многие веб-сайты предоставляют регулярные выражения, но вы должны хорошо изучить и понять их, а также проверить, что то, что вы хотите, чтобы это соответствовало вашим потребностям в официальных форматах RFC для адресов электронной почты.

для изучения регулярных выражений интерпретируемые языки могут быть отличным упрощением и тестовым стендом. Rubular построен на Ruby, но это хороший быстрый способ проверить: http://www.rubular.com/

помимо этого, купите последнее издание книги O'Reilly Book Mastering регулярное выражение. Вы хотите потратить время, чтобы понять первые 3 или 4 главы. Все, что после этого будет строить экспертизу на высоко оптимизированном использовании регулярных выражений.

часто ряд меньших, более простых в управлении регулярных выражений легче поддерживать и отлаживать.

вот расширение строки, которая проверяет электронную почту в 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 для проверки электронной почты. При постоянно меняющихся дву ваш валидатор является неполным или неточным. Вместо этого вы должны использовать Apple NSDataDetector библиотеки, которая будет принимать строку и попытаться увидеть, если есть любые известные месторождения данных (электронные письма, адреса, даты и т. д.). SDK от Apple сделает тяжелую работу по обновлению TLDs, и вы можете отказаться от своих усилий!! :)

плюс, если 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)"
    }
}
// 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;
}