Frage

Was ist der sauberste Weg, um eine E-Mail-Adresse, die ein Benutzer auf iOS 2.0?

tritt zu validieren

Hinweis : Dies ist eine historische Frage, die auf iOS 2.0 spezifisch ist und aufgrund seines Alters und wie viele andere Fragen, die ihm verknüpft sind sie nicht zurückgezogen werden kann und darf nicht zu einer „modernen geändert werden "Frage.

War es hilfreich?

Lösung 3

Die beste Lösung, die ich bisher gefunden habe (und die, die ich am Ende mit zu gehen) ist hinzuzufügen,

Andere Tipps

Die Antwort auf Verwenden eines regulären Ausdrucks eine E-Mail-Adresse zu bestätigen im Detail erklärt, dass die Grammatik in RFC 5322 spezifiziert zu kompliziert für primitive reguläre Ausdrücke wird.

Ich empfehle einen echten Parser Ansatz wie MKEmailAddress .

Wie schnell reguläre Ausdrücke Lösung sieht 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];
}

Lesen Sie den RFC. Fast jeder, der denkt, dass sie wissen, wie zu analysieren / clean / Validierung eine E-Mail-Adresse ist falsch.

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

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

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

Ja, das bedeutet, +‘, usw. sind alle echt.

Ein guter Start ist, zu entscheiden, was Sie und wollen Sie nicht als E-Mail-Adresse akzeptieren?

99% der E-Mail-Adressen wie folgt aussehen: bob.smith@foo.com oder fred@bla.edu

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

Es gibt wahrscheinlich nur wenige gültige E-Mails in der Welt für die Top-Level-Domains, und fast niemand nutzt die meisten dieser anderen Charaktere (vor allem Zitate und Backticks), so dass Sie vielleicht davon ausgehen, dass diese alle ungültigen Dinge machen. Aber Sie sollten sich so als eine bewusste Entscheidung tun.

Darüber hinaus wird das tun, was Paulus sagt, und versuche, wie dies die Eingabe in einen regulären Ausdruck entspricht: ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] + [. AZ] {2,} $

Dass man so ziemlich jedermanns paßt E-Mail-Adresse.

Während der Fokus auf regulären Ausdrücken ist gut, aber das ist nur ein erster und notwendiger Schritt. Es gibt auch andere Schritte, die auch 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 dns Validierung, können Sie auch wählen, eine SMTP-Validierung zu tun. einen Aufruf an den SMTP-Server an ob der Benutzer tatsächlich vorhanden ist.

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

Diese Funktion ist einfach und doch überprüft E-Mail-Adresse gründlicher. Zum Beispiel nach RFC2822 muss eine E-Mail-Adresse enthält zwei Perioden nicht in einer Reihe, wie firstname..lastname @ domain..com

Es ist auch wichtig Anker in regulären Ausdrücke zu verwenden, wie in dieser Funktion gesehen. Ohne Anker der folgende E-Mail-Adresse ist gültig: zuerst, name) lastname@domain.com (blah , weil die lastname@domain.com Abschnitt gültig ist, ignoriert zuerst,. name) am Anfang und (blah am Ende Anker zwingen, den regulären Ausdrücke Motor die gesamte E-Mail bestätigen

.

Diese Funktion verwendet NSPredicate, die in iOS nicht existiert 2. Leider kann es nicht an den Fragesteller helfen, aber hoffentlich andere mit neueren Versionen von iOS helfen. Die regulären Ausdrücke in dieser Funktion kann immer noch in iOS 2 obwohl auf RegexKitLite angewendet werden. Und für diejenigen mit iOS 4 oder höher können diese regulären Ausdrücke mit NSRegularExpression umgesetzt 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 validieren E-Mail-Adresse mit regulären Ausdrücken in 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. 

Ich habe festgestellt, dass ein regulären Ausdruck funktioniert recht gut eine E-Mail-Adresse zu bestätigen.

Der größte Nachteil zu regulären Ausdrücken natürlich Wartbarkeit, so kommentieren wie nie zuvor kommentiert haben. Ich verspreche Ihnen, wenn Sie nicht über werden wollen Sie haben, wenn Sie auf den Ausdruck nach ein paar Wochen zurück.

Hier ist ein Link auf eine gute Quelle, http: //www.regular-expressions. info / email.html .

Graben den Schmutz, aber ich stolperte über SHEmailValidator , die einen perfekten Job tut und hat eine schöne Schnittstelle.

Viele Websites bieten Regexes aber Sie würden gut tun, um zu lernen und zu verstehen sowie zu überprüfen, dass das, was Sie wollen, dass es Ihre Bedürfnisse zu tun, trifft innerhalb der offiziellen RFC für E-Mail-Adressformate.

Für RegEx Lernen, interpretierten Sprachen können ein großer Vereinfacher und Testbed sein. Rubular auf Rubin gebaut, aber es ist eine gute schnelle Art und Weise zu testen und zu überprüfen: http://www.rubular.com/

Darüber hinaus kaufen die neueste Ausgabe des O'Reilly-Buch Reguläre Ausdrücke. Sie wollen die Zeit verbringen, die ersten 3 oder 4 Kapitel zu verstehen. Alles danach wird Know-how aufbauend auf hoch optimierten RegEx Nutzung.

Oft wird eine Reihe von kleineren, leichter zu verwalten Regexes sind leichter zu pflegen und zu debuggen.

Hier ist eine Erweiterung des String, der eine E-Mail in Swift bestätigt.

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

Aus der Antwort kopiert zu: Überprüfen Sie, ob eine E-Mail-Adresse gilt auf iOS

Sie sollten nicht versuchen Regex zu verwenden, um eine E-Mail zu bestätigen. Mit ständig wechselnder TLDs ist Ihr Validator entweder unvollständig oder ungenau. Stattdessen sollten Sie Apples NSDataDetector Bibliotheken nutzen, die einen String nehmen und versuchen zu sehen, ob es irgendwelche bekannten Datenfelder (E-Mails, Adressen, Termine, etc.). Apples SDK tun, das schwere Heben zu halten mit TLDs auf den neuesten Stand und Sie können aus ihren Bemühungen huckepack !! :)

Plus, wenn iMessage (oder irgendein anderes Textfeld) glaubt nicht, es ist eine E-Mail, sollten Sie eine E-Mail betrachten?

habe ich diese Funktion in einer NSString Kategorie, so dass der Zeichenfolge Sie testen ist 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 rasche String Erweiterung

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top