iOS 2.0でメールアドレスを検証するためのベストプラクティスは何ですか
-
03-07-2019 - |
質問
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つのことは:
-
ドメインが実際に存在することを確認するためのDNS検証。
-
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;
}