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

StackOverflow https://stackoverflow.com/questions/800123

質問

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

:これはiOS 2.0に固有の歴史的な質問であり、その年齢とリンクされている他の質問の数が原因で廃止できず、"に変更してはいけません。モダン"質問。

役に立ちましたか?

解決 3

私がこれまでに見つけた最良の解決策(および最終的に解決策)は、 RegexKitLite NSStringカテゴリーを介して正規表現へのアクセスを提供するプロジェクトへ。

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

他のヒント

正規表現を使用してメールアドレスを検証するに対する回答では、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];
}

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

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

dtext           =       NO-WS-CTL /     ; Non white space controls

                        %d33-90 /       ; The rest of the US-ASCII
                        %d94-126        ;  characters not including "[",
                                        ;  "]", or "\"

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

良い出発点は、メールアドレスとして何を受け入れ、何を受け入れたくないかを決めることです。

メールアドレスの99%は、bob.smith @ foo.comまたはfred@bla.eduのようになります

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

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

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

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

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

頭の上にある2つのことは:

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

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

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

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

この関数に見られるように、正規表現でアンカーを使用することも重要です。アンカーがなければ、次のメールアドレスが有効と見なされます: lastname@domain.com セクションが有効であるため、 first; name)lastname@domain.com(blah 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で正規表現を使用してメールアドレスを検証するを参照してください。

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:@"abc@example.com 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. 

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

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

良いソースへのリンクは、 http://www.regular-expressionsです。 info / email.html

汚れを掘り起こしましたが、私は SHEmailValidator を見つけました。インターフェース。

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

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

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

多くの場合、小さくて管理しやすいRegExのシリーズは、保守とデバッグが簡単です。

これは、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}<*>quot;
        let laxString = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*<*>quot;
        let emailRegex = stricterFilter ? stricterFilterString : laxString
        let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailTest.evaluate(with: self)
    }
}

次の回答からコピー:メールアドレスを確認するiOSで有効です

メールの検証に正規表現を使用しないでください。 TLDが絶えず変化するため、バリデータは不完全または不正確です。代わりに、文字列を受け取り、既知のデータフィールド(電子メール、アドレス、日付など)があるかどうかを確認するAppleの NSDataDetector ライブラリを利用する必要があります。 AppleのSDKは、TLDを最新の状態に保つという面倒な作業を行うため、その努力から便乗することができます!! :)

さらに、iMessage(または他のテキストフィールド)が電子メールだと思わない場合は、電子メールを検討する必要がありますか?

この関数を NSString カテゴリに入れたので、テストする文字列は self です。

- (BOOL)isValidEmail {
    // Trim whitespace first
    NSString *trimmedText = [self stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
    if (self && self.length > 0) return NO;

    NSError *error = nil;
    NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];
    if (!dataDetector) return NO;

    // This string is a valid email only if iOS detects a mailto link out of the full string
    NSArray<NSTextCheckingResult *> *allMatches = [dataDetector matchesInString:trimmedText options:kNilOptions range:NSMakeRange(0, trimmedText.length)];
    if (error) return NO;
    return (allMatches.count == 1 && [[[allMatches.firstObject URL] absoluteString] isEqual:[NSString stringWithFormat:@"mailto:%@", self]]);
}

または迅速な String 拡張機能として

extension String {
    func isValidEmail() -> Bool {
        let trimmed = self.trimmingCharacters(in: .whitespacesAndNewlines)
        guard !trimmed.isEmpty, let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
            return false
        }
        let allMatches = dataDetector.matches(in: trimmed, options: [], range: NSMakeRange(0, trimmed.characters.count))

        return allMatches.count == 1 && allMatches.first?.url?.absoluteString == "mailto:\(trimmed)"
    }
}
// Method Call
NSString *email = @"Your Email string..";

BOOL temp = [self validateEmail:email];

if(temp)
{
// Valid
}
else
{
// Not Valid
}
// Method description

- (BOOL) validateEmail: (NSString *) email {
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    BOOL isValid = [emailTest evaluateWithObject:email];
    return isValid;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top