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

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

ПРИМЕЧАНИЕ. Это исторический вопрос, характерный для iOS 2.0, и из-за его возраста и количества других вопросов, связанных с ним, он не может быть удален и НЕ ДОЛЖЕН быть изменен на "современный" вопрос.

Ответ 1

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

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

Ответ 2

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

Ответ 3

Прочтите 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 "\"

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

Ответ 4

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

99% адресов электронной почты выглядят следующим образом: [email protected] или [email protected]

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

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

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

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

Ответ 5

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

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

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

  • После проверки DNS вы также можете выбрать проверку SMTP. отправьте вызов на сервер smtp для посмотрите, действительно ли пользователь существует.

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

Ответ 6

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

Также важно использовать якоря в регулярных выражениях, как показано в этой функции. Без якорей следующий адрес электронной почты считается действительным: first; name) [email protected](blah, потому что раздел [email protected] действителен, игнорируя сначала, имя) в начале и (бла в конце. механизм регулярных выражений для проверки всей электронной почты.

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

Ответ 7

NSString *emailString = textField.text; **// storing the entered email in a string.** 
**// Regular expression to checl the email format.** 
NSString *emailReg = @"[A-Z0-9a-z._%+-][email protected][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:@"[email protected] 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. 

Ответ 8

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

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

Вот ссылка на хороший источник, http://www.regular-expressions.info/email.html.

Ответ 9

Выкапывая грязь, я просто наткнулся на SHEmailValidator, который отлично справляется и имеет приятный интерфейс.

Ответ 10

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

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

Кроме того, купите последнюю версию книги О'Рейли "Освоение регулярных выражений". Вы захотите потратить время, чтобы понять первые 3 или 4 главы. После этого будет строиться экспертиза по высоко оптимизированному использованию RegEx.

Часто ряд более простых и простых в управлении RegExes легче поддерживать и отлаживать.

Ответ 11

Вот расширение String, которое проверяет электронную почту в Swift.

extension String {

    func isValidEmail() -> Bool {
        let stricterFilter = false
        let stricterFilterString = "^[A-Z0-9a-z\\._%+-][email protected]([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"
        let laxString = "^[email protected]([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

Ответ 12

Быстрое расширение строки

extension String {

    var isValidEmail: Bool {
        let regex = "[A-Z0-9a-z._%+][email protected][A-Za-z0-9.]+\\.[A-Za-z]{2,4}"
        let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
        return predicate.evaluate(with: self)
    }
}

использование

"[email protected]".isValidEmail // true
"askdma.com".isValidEmail // false

Ответ 13

Вам не следует пытаться использовать регулярное выражение для проверки электронной почты. При постоянно меняющемся 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)"
    }
}

Ответ 14

// 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._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    BOOL isValid = [emailTest evaluateWithObject:email];
    return isValid;
}