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

StackOverflow https://stackoverflow.com/questions/800123

Вопрос

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

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

Это было полезно?

Решение 3

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

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

Другие советы

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

Я рекомендую настоящий подход к анализатору, например MKАдрес электронной почты.

В качестве быстрого решения регулярных выражений см. эту модификацию Проверка DH:

- (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

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

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

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

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

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

У меня в голове две вещи:

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

  2. После проверки DNS вы также можете выполнить проверку SMTP.Отправьте звонок на SMTP -сервер, чтобы увидеть, существует ли пользователь.

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

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

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

Эта функция использует 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.

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.

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

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

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

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

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

Вот расширение String, которое проверяет электронную почту в 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.

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