it-swarm.com.ru

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

Возможный дубликат:
Рекомендации по проверке адреса электронной почты в Objective-C на iOS 2.0?

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

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

200
raaz

Хорошая функция какао:

-(BOOL) NSStringIsValidEmail:(NSString *)checkString
{
   BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
   NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-][email protected]([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
   NSString *laxString = @"^[email protected]([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
   NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
   NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
   return [emailTest evaluateWithObject:checkString];
}

Дискуссия о слабости и строгости - http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

И поскольку категории просто лучше, вы также можете добавить интерфейс:

@interface NSString (emailValidation) 
  - (BOOL)isValidEmail;
@end

Воплощать в жизнь

@implementation NSString (emailValidation)
-(BOOL)isValidEmail
{
  BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
  NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-][email protected]([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
  NSString *laxString = @"^[email protected]([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
  NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
  NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
  return [emailTest evaluateWithObject:self];
}
@end

А затем использовать:

if([@"[email protected]" isValidEmail]) { /* True */ }
if([@"[email protected]" isValidEmail]) { /* False */ }
551
BadPirate

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

Вот сравнительно простой способ, позволяющий использовать недопустимые адреса: ^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,6}$

Как вы можете использовать регулярные выражения, зависит от версии iOS, которую вы используете.

iOS 4.x и позже

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

iOS 3.x

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

NSString *emailRegex = ...;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
BOOL isValid = [emailTest evaluateWithObject:checkString];

Прочитайте полную статью об этом подходе на cocoawithlove.com .

iOS 2.x

Не содержит совпадений с регулярными выражениями в библиотеках Какао. Тем не менее, вы можете легко включить RegexKit Lite в ваш проект, который дает вам доступ к API регулярного выражения уровня C, включенным в iOS 2.0.

7
benzado

Вот хороший пример с NSRegularExpression, который работает на меня.

[text rangeOfString:@"^[email protected]+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;

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

6
jasongregori

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

по сути это будет выглядеть примерно так

^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

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

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

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

3
PurplePilot