Sprawdź, czy adres e-mail jest poprawny w systemie iOS [duplikat]

Możliwy duplikat:
Najlepsze praktyki walidacji adresu e-mail w Objective-C na iOS 2.0?

Rozwijam aplikację na iPhone ' a, w której użytkownik musi podać swój adres e-mail przy logowaniu.

Jaki jest najlepszy sposób, aby sprawdzić, czy adres e-mail jest prawidłowym adresem e-mail?

Author: Community, 2010-06-29

4 answers

Dobra funkcja kakao:

-(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\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
   NSString *laxString = @"^.+@([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];
}
Dyskusja na temat Lax vs. Strict - http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/

A ponieważ kategorie są po prostu lepsze, możesz też dodać interfejs:

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

Zaimplementuj

@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\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
  NSString *laxString = @"^.+@([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

A następnie użyć:

if([@"[email protected]" isValidEmail]) { /* True */ }
if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ }
 551
Author: BadPirate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 20:33:41

Aby sprawdzić, czy zmienna łańcuchowa zawiera poprawny adres e-mail, najprostszym sposobem jest przetestowanie jej pod kątem wyrażenia regularnego. Istnieje dobre omówienie różnych regex i ich kompromisów na regular-expressions.info .

Tutaj jest stosunkowo prosty, który pochyla się po stronie dopuszczania niektórych nieprawidłowych adresów przez: ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$

Sposób używania wyrażeń regularnych zależy od używanej wersji systemu iOS.

IOS 4.x i Później

Możesz użyć NSRegularExpression, który pozwala na kompilację i testowanie bezpośrednio z wyrażeniem regularnym.

IOS 3.x

Nie zawiera klasy NSRegularExpression, ale zawiera NSPredicate, która może pasować do wyrażeń regularnych.

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

Przeczytaj cały artykuł na temat tego podejścia w cocoawithlove.com .

IOS 2.x

Nie zawiera żadnych pasujących wyrażeń regularnych w bibliotekach Cocoa. Możesz jednak łatwo dołączyć RegexKit Lite do swojego projektu, który zapewnia dostęp do interfejsów API regex na poziomie C zawartych w systemie iOS 2.0.

 7
Author: benzado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-22 21:00:17

[1]} Heres dobry jeden z NSRegularExpression, który działa dla mnie.

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

Możesz wstawić dowolny regex, ale lubię być w stanie to zrobić w jednej linii.

 6
Author: jasongregori,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 23:37:29

Aby zweryfikować łańcuch wiadomości e-mail, musisz napisać Wyrażenie regularne, aby sprawdzić, czy jest on w prawidłowej formie. istnieje wiele w Internecie, ale być ostrożnym, jak niektórzy mogą wykluczyć, co są rzeczywiście legalne adresy.

Zasadniczo będzie to wyglądało mniej więcej tak

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

Właściwie sprawdzenie, czy wiadomość e-mail istnieje i nie odbija się, oznaczałoby wysłanie wiadomości e-mail i sprawdzenie, jaki był wynik. tzn. odbił się lub nie. Jednak może nie odbić się przez kilka godzin lub nie w wszystko i nadal nie być "prawdziwy" adres e-mail. Istnieje wiele usług tam, które rzekomo zrobić to dla Ciebie i prawdopodobnie będzie zapłacona przez Ciebie i szczerze mówiąc, po co trudzić się, aby zobaczyć, czy to jest prawdziwe?

Dobrze jest sprawdzić, czy użytkownik nie podał błędnego adresu e-mail, w przeciwnym razie może wprowadzić go nieprawidłowo, nie zdając sobie z tego sprawy, a następnie zostać zhakowanym za Brak odpowiedzi. Jeśli jednak ktoś chce dodać jakiś adres e-mail to nic nie powstrzyma go przed jego tworzeniem na hotmail lub yahoo (lub wiele innych miejsc), aby uzyskać ten sam koniec.

Tak samo jak wyrażenie regularne i Walidacja struktury, ale zapomnij o walidacji względem usługi.

 3
Author: PurplePilot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-29 11:32:53