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

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

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

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

Ответ 1

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

-(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];
}

Обсуждение Lax vs. Strict - 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 */ }

Ответ 2

Чтобы проверить, содержит ли строковая переменная действительный адрес электронной почты, самый простой способ - проверить его на регулярное выражение. Существует хорошее обсуждение различных регулярных выражений и их компромиссов в regular-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

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

Ответ 3

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

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

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

Ответ 4

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

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

^((?>[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)>)$

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

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

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