168

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

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

4

13 に答える 13

354

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

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];
}
于 2009-07-19T13:24:03.577 に答える
20

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

https://www.rfc-editor.org/rfc/rfc2822 セクション3.4.1は非常に便利です。知らせ

dtext = NO-WS-CTL /; 非空白コントロール

                        %d33-90 /; 残りのUS-ASCII
                        %d94-126; 「[」を含まない文字、
                                        ; "]"、 また "\"

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

于 2009-04-28T22:58:13.617 に答える
17

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

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

于 2009-04-29T14:33:47.393 に答える
10

良いスタートは、あなたが何をし、あなたが電子メールアドレスとして受け入れたくないかを決めることです。

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

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

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

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

これは、ほぼすべての人の電子メールアドレスと一致します。

于 2009-04-28T23:04:40.433 に答える
7

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

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

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

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

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

于 2009-04-28T23:09:26.320 に答える
7

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

この関数に見られるように、正規表現でアンカーを使用することも重要です。アンカーがない場合、次の電子メールアドレスが有効と見なされます:first; name)lastname@domain.com(lastname@domain.comセクションが有効であるため、first; nameを無視します) 、最初と(blah、最後。アンカーは強制的に電子メール全体を検証する正規表現エンジン。

この関数は、iOS 2には存在しないNSPredicateを使用します。残念ながら、この関数は質問者には役立たないかもしれませんが、新しいバージョンのiOSで他の人に役立つことを願っています。ただし、この関数の正規表現は、iOS2の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の正規表現を使用した電子メールアドレスの検証を参照してください。

于 2013-10-15T00:09:40.237 に答える
6
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. 
于 2011-12-30T11:44:56.057 に答える
4

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

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

ここに良い情報源へのリンクがあります、http://www.regular-expressions.info/email.html

于 2009-04-28T22:42:20.393 に答える
3

汚れを掘り起こしましたが、完璧な仕事をし、素晴らしいインターフェースを備えたSHEmailValidatorに出くわしました。

于 2013-11-15T15:11:22.723 に答える
1

多くのWebサイトが正規表現を提供していますが、正規表現を学習して理解し、実行したいことが電子メールアドレス形式の公式RFC内のニーズを満たしていることを確認することをお勧めします。

正規表現を学習するために、インタプリタ言語は優れた単純化とテストベッドになり得ます。RubularはRuby上に構築されていますが、テストと検証をすばやく行うための優れた方法です: http ://www.rubular.com/

それを超えて、O'Reillyの本MasteringRegularExpressionsの最新版を購入してください。最初の3つまたは4つの章を理解するために時間を費やしたいと思うでしょう。その後のすべては、高度に最適化された正規表現の使用に関する専門知識を構築することになります。

多くの場合、一連の小さくて管理しやすい正規表現は、保守とデバッグが簡単です。

于 2011-03-12T10:36:17.767 に答える
0

これは、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でメールアドレスが有効であることを確認する

于 2017-02-16T19:39:12.477 に答える
-2

電子メールの検証に正規表現を使用しようとしないでください。TLDが常に変化しているため、バリデーターは不完全または不正確です。代わりに、文字列を取得するAppleのNSDataDetectorライブラリを利用して、既知のデータフィールド(電子メール、アドレス、日付など)があるかどうかを確認する必要があります。AppleのSDKは、TLDを最新の状態に保つという手間のかかる作業を行い、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)"
    }
}
于 2017-09-05T21:12:07.400 に答える
-7
// 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;
}
于 2014-05-19T14:49:14.607 に答える