Czy ktoś wie, jak zweryfikować adres e-mail w Swift? Znalazłem ten kod:
- (BOOL) validEmail:(NSString*) emailString {
if([emailString length]==0){
return NO;
}
NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];
NSLog(@"%i", regExMatches);
if (regExMatches == 0) {
return NO;
} else {
return YES;
}
}
ale nie mogę go przetłumaczyć na Swift.
ios
validation
email
swift
Giorgio Nocera
źródło
źródło
.coffee
Odpowiedzi:
Użyłbym
NSPredicate
:dla wersji Swift wcześniejszych niż 3.0:
dla wersji Swift wcześniejszych niż 1.2:
źródło
return emailTest.evaluateWithObject(testStr)
byłoby o wiele prostsze i czytelniejsze? Porównywanie== true
jest trochę jak Javascript.Edycja, zaktualizowana do Swift 3:
Oryginalna odpowiedź dla Swift 2:
Działa dobrze.
źródło
Jako
String
rozszerzenie klasySWIFT 4
Stosowanie
źródło
countElements
jest terazcount
Jeśli szukasz czystego i prostego rozwiązania, powinieneś zajrzeć na https://github.com/nsagora/validation-components .
Zawiera predykat sprawdzania poprawności wiadomości e-mail, który można łatwo zintegrować z kodem:
Za maską wykorzystuje RFC 5322 reg ex ( http://emailregex.com ):
źródło
Oto rozsądne rozwiązanie:
„ROZSĄDNE ROZWIĄZANIE”
Używany i testowany od lat w wielu aplikacjach o dużej objętości.
1 - pozwala uniknąć wielu strasznych błędów wyrażenia regularnego, które często widujesz w tych sugestiach
2 - NIE zezwala na głupie wiadomości e-mail, takie jak „x @ x”, które są uważane za prawidłowe w niektórych RFC, ale są całkowicie głupie, nie mogą być używane jako wiadomości e-mail, a które pracownicy wsparcia natychmiast odrzucą, i które wszystkie usługi pocztowe (mailchimp, google, aws itp.) po prostu odrzucają. Jeśli (z jakiegoś powodu) potrzebujesz rozwiązania, które pozwala na takie ciągi znaków jak „x @ x”, użyj innego rozwiązania.
3 - kod jest bardzo, bardzo, bardzo zrozumiały
4 - jest KISS, niezawodny i przetestowany do zniszczenia w aplikacjach komercyjnych z ogromną liczbą użytkowników
5 - kwestia techniczna, predykat jest globalny, jak twierdzi Apple , powinien (uważaj na sugestie kodu, które tego nie mają)
To takie proste.
Wyjaśnienie:
W poniższym opisie „OC” oznacza zwykły znak - literę lub cyfrę.
__firstpart ... musi zaczynać się i kończyć OC. Dla znaków pośrodku możesz mieć pewne znaki, takie jak podkreślnik, ale początek i koniec muszą być OC. (Jednakże, jest to ok mieć tylko jedno OC i to, na przykład: [email protected])
__serverpart ... Masz sekcje takie jak „bla”. które powtarzają się . (A więc mail.city.fcu.edu.) Sekcje muszą zaczynać się i kończyć OC, ale w środku możesz też wstawić myślnik „-”. (Jeśli chcesz, aby inne nietypowe znaki tam, być może podkreślenia, wystarczy dodać przed myślnikiem). Jest OK , aby mieć sekcję, która jest tylko jeden OC. (Jak w [email protected]) Można mieć maksymalnie pięć części, to trzeba mieć. Wreszcie TLD (takie jak .pl) jest ściśle 2 do 8 rozmiaru. Oczywiście po prostu zmień „8” na preferowaną przez dział wsparcia.
WAŻNE!
Musisz zachować predykat jako globalny, nie buduj go za każdym razem.
Zauważ, że jest to pierwsza rzecz, którą Apple wspomina o całym problemie w dokumentacji.
To bardzo zaskakujące, gdy zobaczysz sugestie, które nie buforują predykatu.
źródło
Oto połączenie dwóch najczęściej głosowanych odpowiedzi z poprawnym wyrażeniem regularnym: rozszerzenie String przy użyciu predykatu, dzięki czemu można wywołać string.isEmail
źródło
Najprostszy sposób w Swift 5
Przykład
zwroty...
źródło
Sugerowałbym użycie go jako rozszerzenia String:
I aby go użyć:
źródło
To jest zaktualizowana wersja dla Swift 2.0 - 2.2
źródło
Istnieje wiele poprawnych odpowiedzi, ale wiele wyrażeń regularnych jest niekompletnych i może się zdarzyć, że e-mail typu: „nazwa @ domena” będzie zawierał prawidłowy adres e-mail, ale tak nie jest. Oto kompletne rozwiązanie:
źródło
Oto metoda oparta na
rangeOfString
:Uwaga: zaktualizowana długość TLD.
Oto ostateczny RegEx dla poczty e-mail zgodnie z RFC 5322, należy pamiętać, że najlepiej tego nie używać, ponieważ sprawdza on tylko podstawową składnię adresów e-mail i nie sprawdza, czy istnieje domena najwyższego poziomu.
Zobacz Regular-Expressions.info, aby uzyskać pełniejsze informacje na temat RegExs e-mailem.
Zauważ, że nie ma zmiany znaczenia zgodnie z wymaganiami języka takiego jak Objective-C lub Swift.
źródło
.engineer
istnieją.Wolę użyć do tego rozszerzenia. Poza tym ten adres URL http://emailregex.com może pomóc w sprawdzeniu, czy wyrażenie regularne jest poprawne. W rzeczywistości strona oferuje różne implementacje dla niektórych języków programowania. Udostępniam moją implementację dla Swift 3 .
źródło
Dla wersji Swift 2.1: działa to poprawnie z e-mailem foo @ bar
źródło
Korzystanie z Swift 4.2
I używane
źródło
To nowa wersja „ REASONABLE SOLUTION” autorstwa @Fattie, przetestowana na Swift 4.1 w nowym pliku o nazwie
String+Email.swift
:Jego użycie jest proste:
Po prostu nie lubię dodawać
func
doString
obiektów a, ponieważ adres e-mail jest z nimi związany (lub nie). Tak więcBool
własność pasowałaby lepiej niżfunc
, z mojego zrozumienia.źródło
Utwórz proste rozszerzenie:
Przykład:
Można rozszerzyć po rozszerzeniu do niczego potrzebne są:
isValidPhoneNumber
,isValidPassword
etc ...źródło
NSRange
długości należy użyć właściwości lengthString
utf16.count
characters.count
W Swift 4.2 i Xcode 10.1
Jeśli chcesz użyć SharedClass.
I funkcja wywołania taka jak ta ....
źródło
Stworzyłem bibliotekę przeznaczoną do sprawdzania poprawności danych wejściowych, a jeden z „modułów” pozwala łatwo zweryfikować wiele rzeczy ...
Na przykład, aby sprawdzić poprawność wiadomości e-mail:
SwiftCop to biblioteka ... mam nadzieję, że pomoże!
źródło
Oto rozszerzenie do Swift 3
Po prostu użyj tego w ten sposób:
źródło
Ponieważ jest teraz tak wiele dziwnych nazw domen najwyższego poziomu, przestaję sprawdzać długość domeny najwyższego poziomu ...
Oto czego używam:
źródło
Wydaje się też działać ...
źródło
Zaktualizowano odpowiedź @Arsonik do Swift 2.2, używając mniej pełnego kodu niż inne oferowane rozwiązania:
źródło
@ Odpowiedź JeffersonBe jest bliska, ale zwraca,
true
jeśli ciąg znaków to „coś, co zawiera komuś@something.com prawidłowy adres e-mail”, czego nie chcemy. Poniżej znajduje się rozszerzenie String, które działa dobrze (i umożliwia testowanie prawidłowego numeru telefonu i innych detektorów danych do uruchomienia.źródło
A dla Swift 3 :
źródło
Moim jedynym dodatkiem do listy odpowiedzi byłoby to, że dla Linuksa
NSRegularExpression
nie istnieje, to jest tak naprawdęRegularExpression
Kompiluje to z powodzeniem zarówno w systemie macOS, jak i Ubuntu.
źródło
Najlepsze rozwiązanie z najlepszym wynikiem dla
źródło
Lubię tworzyć rozszerzenia
stosowanie:
źródło
Szybki 5
Następnie:
źródło
Perfect Regex, taki jak Google Email
źródło
Lub możesz mieć rozszerzenie dla opcjonalnego tekstu UITextField:
jak używać:
rozbudowa:
źródło