web-dev-qa-db-ja.com

iOS 2.0でメールアドレスを検証するためのベストプラクティスは何ですか

ユーザーがiOS 2.0で入力したメールアドレスを検証する最もクリーンな方法は何ですか?

NOTE:これはiOS 2.0に固有の歴史的な質問であり、その年齢とリンクされている他の質問の数のために引退することはできず、「現代」に変更してはなりません質問。

167
Marcus S. Zarra

私がこれまでに見つけた最良の解決策(そして私が最終的に行った解決策)は、NSString Categoriesを介して正規表現へのアクセスを提供するプロジェクトに RegexKitLite を追加することです。

プロジェクトに追加するのは非常に簡単で、一度配置すれば、正規表現の電子メール検証ロジックはすべて機能します。

17
Marcus S. Zarra

正規表現を使用して電子メールアドレスを検証する への答えは、RFC 5322で指定された文法が原始的な正規表現には複雑すぎることを詳細に説明しています。

MKEmailAddressのような実際のパーサーアプローチをお勧めします

クイック正規表現ソリューションとして、この DHValidation の変更を参照してください。

- (BOOL) validateEmail: (NSString *) candidate {
    NSString *emailRegex =
@"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}"
@"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
@"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
@"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
@"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
@"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
@"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES[c] %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate];
}
354
catlan

RFCを読んでください。電子メールアドレスの解析/クリーニング/検証の方法を知っていると考えるほとんどの人は間違っています。

http://tools.ietf.org/html/rfc2822 セクション3.4.1は非常に便利です。通知

 dtext = NO-WS-CTL /;空白以外のコントロール
 
%d33-90 /;残りのUS-ASCII 
%d94-126; 「[」、
を含まない文字。 "]"、 または "\"

はい、それは+、 'などがすべて合法であることを意味します。

20
Trey

良いスタートは、あなたが何を決定し、メールアドレスとして受け入れたくないのですか?

電子メールアドレスの99%は、bob.smith @ foo.comまたは[email protected]のようになります。

ただし、f!#$%&'*+-/=?^_ {|}〜 "ha!" @ comのような電子メールアドレスを持つことは技術的に合法です。

おそらく、トップレベルドメイン向けの有効なメールは世界中にほんの一握りしかないため、他のほとんどの文字(特に引用符とバッククォート)を使用する人はほとんどいないので、これらはすべて無効なものであると想定することができます。しかし、あなたは意識的な決断としてそうすべきです。

さらに、Paulの言うことを実行して、入力を次のような正規表現に一致させます:^ [A-Z0-9 ._%+-] + @ [A-Z0-9 .-] +。[AZ] { 2、} $

これは、ほぼ全員のメールアドレスに一致します。

10

この機能はシンプルですが、メールアドレスをより徹底的にチェックします。たとえば、RFC2822によると、電子メールアドレスにはfirstname..lastname @ domain..comのように2つのピリオドを連続して含めることはできません

この関数に見られるように、正規表現でアンカーを使用することも重要です。アンカーがなければ、次のメールアドレスが有効と見なされます:first; name)[email protected](blahなぜなら [email protected]セクションは有効で、先頭のfirst; name)(blah最後に。アンカーは、正規表現エンジンにメール全体を検証させます。

この関数は、iOS 2には存在しないNSPredicateを使用します。残念ながら、それは質問者には役立たないかもしれませんが、iOSの新しいバージョンで他の人に役立つことを願っています。ただし、この関数の正規表現は、iOS 2のRegExKitLiteにも適用できます。 iOS 4以降を使用している場合、これらの正規表現はNSRegularExpressionで実装できます。

- (BOOL)isValidEmail:(NSString *)email
{
    NSString *regex1 = @"\\A[a-z0-9]+([-._][a-z0-9]+)*@([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,4}\\z";
    NSString *regex2 = @"^(?=.{1,64}@.{4,64}$)(?=.{6,100}$).*";
    NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1];
    NSPredicate *test2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex2];
    return [test1 evaluateWithObject:email] && [test2 evaluateWithObject:email];
}

Objective-Cの正規表現を使用してメールアドレスを検証する を参照してください。

7
Geek

正規表現に重点を置いていますが、これは最初の必要な手順にすぎません。優れた検証戦略を説明する必要がある他のステップもあります。

私の頭の上の2つのことは:

  1. ドメインが実際に存在することを確認するDNS検証。

  2. DNS検証の後、SMTP検証を選択することもできます。 smtpサーバーに呼び出しを送信して、ユーザーが実際に存在するかどうかを確認します。

このようにして、あらゆる種類のユーザーエラーをキャッチし、それが有効なメールであることを確認できます。

7
Srikar Doddi
NSString *emailString = textField.text; **// storing the entered email in a string.** 
**// Regular expression to checl the email format.** 
NSString *emailReg = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",emailReg]; 
if (([emailTest evaluateWithObject:emailString] != YES) || [emailStringisEqualToString:@""]) 
{ 
UIAlertView *loginalert = [[UIAlertView alloc] initWithTitle:@" Enter Email in" message:@"[email protected] format" delegate:self 
cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

enter code here

[loginalert show]; 
[loginalert release]; 
} 
If email is invalid, it will remind the user with an alert box. 
Hope this might be helpful for you all. 
6
hirak

正規表現を使用すると、メールアドレスを検証するのに非常にうまく機能することがわかりました。

もちろん、正規表現の主な欠点は保守性です。したがって、これまでにコメントしたことのないコメントをしてください。もしそうでないなら、数週間後に式に戻ったときに望んでいたことをお約束します。

適切なソースへのリンク http://www.regular-expressions.info/email.html です。

4
Paul Redman

汚れを掘り起こしましたが、私はただつまずいただけです SHEmailValidator これは完璧な仕事をし、素敵なインターフェースを持っています。

3
Cyrille

多くのWebサイトはRegExesを提供していますが、それらを学習して理解し、やりたいことがメールアドレス形式の公式RFC内のニーズを満たしていることを確認することをお勧めします。

RegExを学習する場合、インタープリター言語は非常に単純化され、テストベッドになります。 RubularはRuby上に構築されていますが、テストと検証を行うための優れた迅速な方法です。 http://www.rubular.com/

さらに、O'Reillyの書籍Mastering Regular Expressionsの最新版を購入してください。最初の3つまたは4つの章を理解するのに時間をかける必要があります。その後は、高度に最適化されたRegExの使用に関する専門知識を構築します。

多くの場合、一連の小規模で管理しやすいRegExの方が、保守とデバッグが簡単です。

1
user656483

以下は、Swiftでメールを検証するStringの拡張です。

extension String {

    func isValidEmail() -> Bool {
        let stricterFilter = false
        let stricterFilterString = "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"
        let laxString = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
        let emailRegex = stricterFilter ? stricterFilterString : laxString
        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailTest.evaluate(with: self)
    }
}

回答からコピー: メールアドレスがiOSで有効であることを確認してください

0
grez