201

重複の可能性:
iOS 2.0 の Objective-C で電子メール アドレスを検証するためのベスト プラクティス?

ログイン時にユーザーが自分のメールアドレスを入力する必要があるiPhoneアプリケーションを開発しています。

メールアドレスが有効なメールアドレスかどうかを確認する最良の方法は何ですか?

4

4 に答える 4

554

優れたカカオ機能:

-(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 と 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([@"emailString@email.com" isValidEmail]) { /* True */ }
if([@"InvalidEmail@notreallyemailbecausenosuffix" isValidEmail]) { /* False */ }
于 2010-09-03T17:50:28.803 に答える
7

文字列変数に有効な電子メール アドレスが含まれているかどうかを確認する最も簡単な方法は、正規表現に対してテストすることです。regular-expressions.infoには、さまざまな正規表現とそのトレードオフについての良い議論があります。

これは、いくつかの無効なアドレスを許可するという側面に傾いている比較的単純なものです。^[A-Z0-9._%+-]+@[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を簡単に含めることができます。これにより、iOS 2.0 に含まれる C レベルの正規表現 API にアクセスできます。

于 2011-05-22T21:00:17.810 に答える
6

私のために働いている NSRegularExpression の良いものがあります。

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

好きな正規表現を挿入できますが、1 行で挿入できるのが気に入っています。

于 2011-07-19T23:37:29.090 に答える
3

電子メール文字列を検証するには、正規表現を記述して正しい形式であることを確認する必要があります。ウェブ上にはたくさんありますが、実際に合法的な住所を除外するものもあるので注意してください。

基本的には次のようになります

^((?>[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(または他の多くの場所)で作成するのを止めるものは何もありません.

したがって、正規表現を実行して構造を検証しますが、サービスに対する検証については忘れてください。

于 2010-06-29T11:32:53.343 に答える