Was sind Best Practices für die Überprüfung von E-Mail-Adressen unter iOS 2.0?


167

Was ist der sauberste Weg, um eine E-Mail-Adresse zu überprüfen, die ein Benutzer unter iOS 2.0 eingibt?

HINWEIS : Dies ist eine historische Frage, die spezifisch für iOS 2.0 ist. Aufgrund ihres Alters und der Anzahl der damit verbundenen anderen Fragen kann sie nicht zurückgezogen werden und darf NICHT in eine "moderne" Frage geändert werden.


Ich suche eine Kakaolösung. Ich verstehe die Gültigkeit von E-Mails und die Regeln für die Validierung von E-Mails. Da RegEx auf Cocoa Touch nicht leicht zugänglich ist, suche ich nach einer Cocoa Touch-Lösung für die Validierung. Keine Liste der Regeln zur Validierung.
Marcus S. Zarra

Bisher ist der beste Code-Vorschlag, den ich gefunden habe, die Verwendung von RegExKitLite und regulären Ausdrücken. Zum Glück ist es weniger schmerzhaft als es klingt.
Marcus S. Zarra

Siehe Kommentare unten zur Verwendung von NSRegularExpression für Apps, die OS <4.0 nicht unterstützen.
beon

1
Da dies die kanonische Frage bezüglich der Validierung von E-Mail-Adressen zu sein scheint, ist es sinnvoll, mit verbesserten Antworten zu aktualisieren, wenn iOS ausgereift ist. In diesem Sinne habe ich eine Antwort hinzugefügt, die iOS verwendet NSDataDetector, um E-Mail-Adressen zu validieren: stackoverflow.com/a/23547905/257550
memmons

2
Diese Frage scheint nicht zum Thema zu gehören, da es sich um iOS 2.0 handelt, das vor Jahren veraltet war.
Nathan Eror

Antworten:


354

Die Antwort auf Verwenden eines regulären Ausdrucks zum Überprüfen einer E-Mail-Adresse erklärt ausführlich, dass die in RFC 5322 angegebene Grammatik für primitive reguläre Ausdrücke zu kompliziert ist.

Ich empfehle einen echten Parser-Ansatz wie MKEmailAddress .

Als schnelle Lösung für reguläre Ausdrücke siehe diese Modifikation von 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];
}

9
Großartig, funktioniert aber nicht unter OS <3.0, da NSPredicate nicht verfügbar ist.
Felixyz

4
Nett. Jeder vergisst, dass NSPredicate Regexps ausführen kann.
Rog

5
Das ist eine sehr schlechte Regexp. Beispielsweise schlägt dies bei Personen fehl, die die Top-Domain .museum verwenden. Siehe diesen Artikel: linuxjournal.com/article/9585
Jonny

18
Unter cocoawithlove.com/2009/06/… gibt es eine vollständigere Regex , die anstelle dieser einfachen verwendet werden kann.
Tomas Andrle

12
Hier ist eine sehr naive, aber liberale E-Mail-Regex als Kakao-Zeichenfolge: @"[^@]+@[^.@]+(\\.[^.@]+)+"Wenn Sie eine E-Mail-Adresse überprüfen müssen, senden Sie eine Nachricht an diese und prüfen Sie, ob sie erfolgreich ist. Sie werden es niemals mit einem Regex allein mit irgendeiner Genauigkeit überprüfen. Es ist daher am besten, nicht auf Benutzer zu pissen und Anmeldungen aufgrund eines unnötig strengen Regex zu verlieren.
Sami Samhuri

20

Lesen Sie den RFC. Fast jeder, der glaubt zu wissen, wie man eine E-Mail-Adresse analysiert / bereinigt / validiert, ist falsch.

http://tools.ietf.org/html/rfc2822 Abschnitt 3.4.1 ist sehr nützlich. Beachten

dtext = NO-WS-CTL /; Steuerelemente ohne Leerzeichen

                        % d33-90 /; Der Rest der US-ASCII
                        % d94-126; Zeichen ohne "[",
                                        ;; "]", oder "\"

Ja, das bedeutet, dass +, 'usw. alle legitim sind.


Stand Stand Mai 2016: RFC5322, Abschnitt 3.4.1
Leanne

17

Die beste Lösung, die ich bisher gefunden habe (und die ich letztendlich gefunden habe), ist das Hinzufügen von RegexKitLite zum Projekt, das den Zugriff auf reguläre Ausdrücke über NSString-Kategorien ermöglicht.

Es ist ziemlich einfach, das Projekt zu erweitern, und sobald es eingerichtet ist, funktioniert jede E-Mail-Validierungslogik für reguläre Ausdrücke.


5
NSPredicate kann RegEx ausführen, ohne Ihrem Projekt zusätzliche Bibliotheken hinzuzufügen.
BadPirate

10
Diese Frage wurde ab April 2009 gestellt, bevor NSPredicate unter iOS existierte.
Marcus S. Zarra

7
Wiederum existierte NSRegularExpression in iOS 2.0 NICHT, als diese Frage gestellt wurde.
Marcus S. Zarra

9
@Marcus, der Punkt des Stapelüberlaufs besteht nicht darin, eine historische Aufzeichnung darüber zu führen, wie bestimmte Probleme in der Vergangenheit gelöst wurden. Trotzdem habe ich Ihre Frage bearbeitet, um den 2.0-Kompatibilitätswinkel hervorzuheben.
Benzado

2
Bitte lesen Sie den Titel, dies ist für iOS 2.0, dessen Lösung Catlan nicht existierte.
Marcus S. Zarra

10

Ein guter Anfang ist zu entscheiden, was Sie tun und was Sie nicht als E-Mail-Adresse akzeptieren möchten?

99% der E-Mail-Adressen sehen folgendermaßen aus: bob.smith@foo.com oder fred@bla.edu

Es ist jedoch technisch legal, eine E-Mail-Adresse wie diese zu haben: f !#$%&'*+-/=?^_{|} ~ "ha!" @ Com

Es gibt wahrscheinlich nur eine Handvoll gültiger E-Mails auf der Welt für Top-Level-Domains, und fast niemand verwendet die meisten dieser anderen Zeichen (insbesondere Anführungszeichen und Backticks). Daher sollten Sie davon ausgehen, dass dies alles ungültige Dinge sind. Aber Sie sollten dies als bewusste Entscheidung tun.

Tun Sie darüber hinaus, was Paulus sagt, und versuchen Sie, die Eingabe einem regulären Ausdruck wie diesem zuzuordnen: ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [AZ] { 2,} $

Dieser wird so ziemlich jeder E-Mail-Adresse entsprechen.


Obwohl diese Antwort im Jahr 2009 verfasst wurde, ist sie in den Suchergebnissen immer noch sehr hoch. Ich wollte nur hinzufügen, dass dies nicht mehr aktuell ist und der obige reguläre Ausdruck etwas restriktiv ist. Zum Beispiel können Sie jetzt 4-stellige oder mehr Top-Level-Domain haben
Jack

Guter Punkt, bearbeitet es auf "mindestens 2 Ziffern". Fühlen Sie sich frei, weiter zu bearbeiten, wenn Sie möchten.
Brandon Yarbrough

7

Der Fokus auf reguläre Ausdrücke ist zwar gut, aber dies ist nur ein erster und notwendiger Schritt. Es gibt andere Schritte, die ebenfalls für eine gute Validierungsstrategie berücksichtigt werden müssen.

Zwei Dinge auf meinem Kopf sind:

  1. DNS-Validierung, um sicherzustellen, dass die Domain tatsächlich vorhanden ist.

  2. Nach der DNS-Validierung können Sie auch eine SMTP-Validierung durchführen. Senden Sie einen Anruf an den SMTP-Server, um festzustellen, ob der Benutzer tatsächlich vorhanden ist.

Auf diese Weise können Sie alle Arten von Benutzerfehlern abfangen und sicherstellen, dass es sich um eine gültige E-Mail handelt.


7

Diese Funktion ist einfach und überprüft die E-Mail-Adresse dennoch gründlicher. Beispielsweise darf eine E-Mail-Adresse gemäß RFC2822 nicht zwei Punkte hintereinander enthalten, z. B. Vorname..Nachname @ Domäne..com

Es ist auch wichtig, Anker in regulären Ausdrücken zu verwenden, wie in dieser Funktion gezeigt. Ohne Anker wird die folgende E-Mail-Adresse als gültig angesehen: Vorname; Name) Nachname@domain.com (bla, da der Abschnitt Nachname@domain.com gültig ist, wobei Vorname ignoriert wird ; Name) am Anfang und (bla am Ende. Anker erzwingen die Engine für reguläre Ausdrücke zur Validierung der gesamten E-Mail.

Diese Funktion verwendet NSPredicate, das in iOS 2 nicht vorhanden ist. Leider hilft es dem Fragesteller möglicherweise nicht, aber hoffentlich hilft es anderen mit neueren Versionen von iOS. Die regulären Ausdrücke in dieser Funktion können jedoch weiterhin auf RegExKitLite in iOS 2 angewendet werden. Und für Benutzer von iOS 4 oder höher können diese regulären Ausdrücke mit NSRegularExpression implementiert werden.

- (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];
}

Siehe Überprüfen der E-Mail-Adresse mit regulären Ausdrücken in Objective-C .


iOS 2.0 hatte kein NSPredicate.
Marcus S. Zarra

2
Aber was ist die Verwendung dieser Frage und was ist die Verwendung von ios 2. Wir haben das neueste Betriebssystem, nämlich ios 7.1. Sie können auch ios 6 verwenden.
Gaurav Gilani

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. 

4

Ich habe festgestellt, dass die Verwendung eines regulären Ausdrucks zum Überprüfen einer E-Mail-Adresse recht gut funktioniert.

Der Hauptnachteil regulärer Ausdrücke ist natürlich die Wartbarkeit. Kommentieren Sie also, wie Sie es noch nie zuvor getan haben. Ich verspreche Ihnen, wenn Sie dies nicht tun, werden Sie es wünschen, wenn Sie nach ein paar Wochen zum Ausdruck zurückkehren.

Hier ist ein Link zu einer guten Quelle, http://www.regular-expressions.info/email.html .


Ich habe kürzlich den vorletzten auf dieser Seite implementiert und bin ziemlich zufrieden damit. Es funktioniert gut für eine einfache E-Mail-Adresse von user@host.com, ohne Anführungszeichen oder Klammern für einen vollständigen Namen. Funktioniert hervorragend für die Validierung von Webformularen, bei denen die Leute sowieso nichts dergleichen eingeben.
Zombat

2
Arme Menschen mit ihrer .museum TLD.
BadPirate

3

Den Dreck ausgraben , aber ich bin gerade auf SHEmailValidator gestoßen, der einen perfekten Job macht und eine schöne Oberfläche hat.


Diese Frage war spezifisch für iOS 2.0, das kein NSPredicate oder eine ganze Reihe anderer Dinge hatte, die in dieser Bibliothek verwendet werden.
Marcus S. Zarra

1
Ich weiß, aber ich bin zuerst hier gelandet, als ich nach "ios email validation" gesucht habe. Vielleicht werde ich in Zukunft die gleiche Suche durchführen und hier landen, und es wird ihm einige Zeit sparen.
Cyrille

1

Viele Websites bieten RegExes an, aber Sie sollten sie gut lernen und verstehen sowie überprüfen, ob das, was Sie möchten, Ihren Anforderungen innerhalb des offiziellen RFC für E-Mail-Adressformate entspricht.

Für das Erlernen von RegEx können interpretierte Sprachen eine große Vereinfachung und Testumgebung sein. Rubular basiert auf Ruby, ist jedoch eine gute Möglichkeit zum schnellen Testen und Überprüfen: http://www.rubular.com/

Kaufen Sie darüber hinaus die neueste Ausgabe des O'Reilly-Buches Mastering Regular Expressions. Sie sollten sich die Zeit nehmen, um die ersten 3 oder 4 Kapitel zu verstehen. Alles danach wird Fachwissen über eine hochoptimierte RegEx-Nutzung aufbauen.

Oft ist eine Reihe kleinerer, einfacher zu verwaltender RegExes einfacher zu warten und zu debuggen.


0

Hier ist eine Erweiterung von String, die eine E-Mail in Swift validiert.

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)
    }
}

Von der Antwort kopiert an: Überprüfen Sie, ob eine E-Mail-Adresse unter iOS gültig ist


Es gab keine NSPredicateauf iOS 2.0
Marcus S. Zarra

-2

Sie sollten nicht versuchen, eine E-Mail mit Regex zu validieren. Bei sich ständig ändernden TLDs ist Ihr Validator entweder unvollständig oder ungenau. Stattdessen sollten Sie die Apple- NSDataDetectorBibliotheken nutzen, die eine Zeichenfolge verwenden und versuchen, festzustellen, ob Datenfelder (E-Mails, Adressen, Daten usw.) bekannt sind. Apples SDK wird es schwer haben, mit TLDs auf dem neuesten Stand zu bleiben, und Sie können sich von ihren Bemühungen huckepack nehmen !! :) :)

Wenn iMessage (oder ein anderes Textfeld) nicht der Meinung ist, dass es sich um eine E-Mail handelt, sollten Sie eine E-Mail in Betracht ziehen.

Ich habe diese Funktion in eine NSStringKategorie eingeordnet, daher lautet die Zeichenfolge, die Sie testen 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]]);
}

oder als schnelle StringErweiterung

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)"
    }
}

1
Diese Frage stammt von vor acht Jahren.
Marcus S. Zarra

1
Und doch, wenn Sie Google validate email objective-c, ist diese Frage das dritte Ergebnis. Einige Dinge im Internet altern nicht. :-)
Craig Otis

1
Bitte hören Sie auf, unter jedem Beitrag, der sich auf die Überprüfung von E-Mail-Adressen bezieht, Links zu dieser Antwort zu spammen. Kommentare dienen der Bitte um Klarstellung und nicht dem Spammen von Links zu Ihren Antworten.
Meagar

Übrigens NSDataDetectorgab es in iOS 2.0 NICHT, worum es bei dieser Frage ging.
Marcus S. Zarra

-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;
}

3
Dieser Thread / diese Frage ist für iOS 2. NSPredicatewar in iOS 2 nicht vorhanden. es wurde erst iOS 3 hinzugefügt.
Marcus S. Zarra

3
Ich antwortete, weil Ihre Antwort falsch ist. Die Frage lautet "Wie machst du X unter iOS Y?" Und du hast mit einem Framework geantwortet, das in dieser Version von iOS nicht existiert.
Marcus S. Zarra
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.