ユーザーがログイン時にメールアドレスを入力する必要があるiPhoneアプリケーションを開発しています。
メールアドレスが有効なメールアドレスであるかどうかを確認する最良の方法は何ですか?
優れたココア機能:
-(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];
}
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\\._%+-]+@([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
そして次に利用する:
if([@"[email protected]" isValidEmail]) { /* True */ }
if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ }
文字列変数に有効なメールアドレスが含まれているかどうかを確認するには、正規表現に対してテストするのが最も簡単な方法です。 regular-expressions.info で、さまざまな正規表現とそのトレードオフについての良い議論があります。
以下は、いくつかの無効なアドレスを許可するという側面に頼る比較的単純なものです:^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$
正規表現の使用方法は、使用しているiOSのバージョンによって異なります。
NSRegularExpression
を使用すると、正規表現を直接コンパイルおよびテストできます。
NSRegularExpression
クラスは含まれませんが、正規表現と照合できるNSPredicate
クラスは含まれます。
NSString *emailRegex = ...;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
BOOL isValid = [emailTest evaluateWithObject:checkString];
cocoawithlove.com で、このアプローチに関する記事全体を読んでください。
Cocoaライブラリに一致する正規表現は含まれません。ただし、プロジェクトに RegexKit Lite を簡単に含めることができます。これにより、iOS 2.0に含まれているCレベルの正規表現APIにアクセスできます。
NSRegularExpressionを使用して、私のために機能しているものを紹介します。
[text rangeOfString:@"^.+@.+\\..{2,}$" options:NSRegularExpressionSearch].location != NSNotFound;
どんな正規表現でも挿入できますが、1行でできることが好きです。
電子メール文字列を検証するには、正しい形式であることを確認する正規表現を記述する必要があります。ウェブ上にはたくさんの情報がありますが、実際には有効なアドレスを除外できる場合があるので注意してください。
基本的には次のようになります
^((?>[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(または他の多くの場所)で作成するのを止めるものは何もありません。
したがって、正規表現を実行して構造を検証しますが、サービスに対して検証することは忘れてください。