Каковы лучшие практики для проверки адресов электронной почты на iOS 2.0 - PullRequest
167 голосов
/ 29 апреля 2009

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

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

Ответы [ 13 ]

354 голосов
/ 19 июля 2009

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

Читайте 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 "\"

Да, это означает, что +, 'и т. Д. Являются законными.

17 голосов
/ 29 апреля 2009

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

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

10 голосов
/ 29 апреля 2009

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

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

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

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

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

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

7 голосов
/ 15 октября 2013

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

Также важно использовать якоря в регулярных выражениях, как показано в этой функции. Без привязок следующий адрес электронной почты считается действительным: first; name) lastname@domain.com (blah , поскольку раздел lastname@domain.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 .

7 голосов
/ 29 апреля 2009

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

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

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

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

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

6 голосов
/ 30 декабря 2011
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. 
4 голосов
/ 29 апреля 2009

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

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

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

3 голосов
/ 15 ноября 2013

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

1 голос
/ 12 марта 2011

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

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

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

Зачастую серию небольших, более простых в управлении RegEx, проще поддерживать и отлаживать.

...