Adakah yang tahu cara memvalidasi alamat email di Swift? Saya menemukan kode ini:
- (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;
}
}
tapi saya tidak bisa menerjemahkannya ke Swift.
ios
validation
email
swift
Giorgio Nocera
sumber
sumber
.coffee
Jawaban:
Saya akan menggunakan
NSPredicate
:untuk versi Swift lebih awal dari 3.0:
untuk versi Swift lebih awal dari 1.2:
sumber
return emailTest.evaluateWithObject(testStr)
akan jauh lebih sederhana dan mudah dibaca? Dibandingkan dengan== true
sedikit seperti Javascript.Pengeditan, diperbarui untuk Swift 3:
Jawaban asli untuk Swift 2:
Ini bekerja dengan baik.
sumber
Sebagai
String
ekstensi kelasSWIFT 4
Pemakaian
sumber
countElements
sekarangcount
Jika Anda mencari solusi yang bersih dan sederhana untuk melakukan ini, Anda harus melihat di https://github.com/nsagora/validation-components .
Ini berisi predikat validasi email yang mudah diintegrasikan dalam kode Anda:
Di balik kapnya menggunakan RFC 5322 reg ex ( http://emailregex.com ):
sumber
Inilah solusi yang masuk akal:
"SOLUSI YANG WAJAR"
Digunakan dan diuji selama bertahun-tahun di banyak aplikasi volume besar.
1 - itu menghindari banyak kesalahan regex mengerikan yang sering Anda lihat dalam saran ini
2 - TIDAK mengizinkan email bodoh seperti "x @ x" yang dianggap valid di bawah RFC tertentu, tetapi benar-benar konyol, tidak dapat digunakan sebagai email, dan staf pendukung Anda akan langsung menolak, dan yang semuanya layanan mailer (mailchimp, google, aws, dll) cukup ditolak. Jika (karena alasan tertentu) Anda membutuhkan solusi yang memungkinkan string seperti 'x @ x', gunakan solusi lain.
3 - kode ini sangat, sangat, sangat bisa dimengerti
4 - ini KISS, dapat diandalkan, dan diuji untuk penghancuran pada aplikasi komersial dengan jumlah pengguna yang sangat besar
5 - poin teknis, predikatnya adalah global, seperti yang dikatakan Apple (perhatikan saran kode yang tidak memiliki ini)
Sangat mudah.
Penjelasan:
Dalam uraian berikut, "OC" berarti karakter biasa - huruf atau angka.
__firstpart ... harus memulai dan mengakhiri dengan OC. Untuk karakter di tengah Anda dapat memiliki karakter tertentu seperti garis bawah, tetapi awal dan akhir harus menjadi OC. (Namun, tidak apa - apa memiliki hanya satu OC dan hanya itu, misalnya: [email protected])
__serverpart ... Anda memiliki bagian seperti "bla." yang berulang . (Jadi jenis mail.city.fcu.edu.) Bagian harus dimulai dan diakhiri dengan OC, tetapi di tengah Anda juga dapat memiliki tanda hubung "-". (Jika Anda ingin mengizinkan karakter tidak biasa lainnya di sana, mungkin garis bawah, cukup tambahkan sebelum tanda hubung.) Tidak apa - apa untuk memiliki bagian yang hanya satu OC. (Seperti dalam [email protected]) Anda dapat memiliki hingga lima bagian, Anda harus memiliki satu. Akhirnya TLD (seperti .com) secara ketat 2-8 di ukuran . Jelas, ubah saja "8" itu seperti yang disukai oleh departemen dukungan Anda.
PENTING !
Anda harus mempertahankan predikat sebagai global, jangan membangunnya setiap saat.
Perhatikan bahwa ini adalah hal pertama yang Apple sebutkan tentang keseluruhan masalah dalam dokumen.
Sangat mengejutkan ketika Anda melihat saran yang tidak menyembunyikan predikat.
sumber
Berikut ini sekering dari dua jawaban yang paling banyak dipilih dengan regex yang benar: ekstensi String menggunakan predikat sehingga Anda dapat memanggil string.isEmail
sumber
Cara termudah di Swift 5
Contoh
kembali ...
sumber
Saya sarankan menggunakannya sebagai ekstensi dari String:
Dan untuk menggunakannya:
sumber
Ini adalah versi terbaru untuk Swift 2.0 - 2.2
sumber
Ada banyak jawaban yang benar di sini, tetapi banyak dari "regex" tidak lengkap dan dapat terjadi bahwa email seperti: "name @ domain" menghasilkan email yang valid, tetapi ternyata tidak. Berikut solusi lengkapnya:
sumber
Berikut adalah metode berdasarkan
rangeOfString
:Catatan: panjang TLD yang diperbarui.
Berikut adalah RegEx definitif untuk email sesuai RFC 5322, perhatikan bahwa ini paling baik tidak digunakan karena hanya memeriksa sintaksis dasar alamat email dan tidak memeriksa apakah domain tingkat atas ada.
Lihat Regular-Expressions.info untuk informasi lebih lengkap tentang email RegExs.
Perhatikan bahwa tidak ada yang lolos seperti yang disyaratkan oleh bahasa seperti Objective-C atau Swift.
sumber
.engineer
ada.Saya lebih suka menggunakan ekstensi untuk itu. Selain itu, url ini http://emailregex.com dapat membantu Anda menguji apakah regex benar. Bahkan, situs ini menawarkan implementasi differents untuk beberapa bahasa pemrograman. Saya membagikan implementasi saya untuk Swift 3 .
sumber
Untuk swift 2.1: ini berfungsi dengan benar dengan email foo @ bar
sumber
Penggunaan Swift 4.2
Dan digunakan
sumber
Ini versi baru untuk "THE REASONABLE SOLUTION" oleh @Fattie, diuji pada Swift 4.1 dalam file baru bernama
String+Email.swift
:Jadi penggunaannya sederhana:
Aku hanya tidak ingin menambahkan
func
keString
objek, sebagai alamat e-mail melekat kepada mereka (atau tidak). JadiBool
properti akan lebih cocok daripadafunc
, dari pemahaman saya.sumber
Buat ekstensi sederhana:
Contoh:
Anda dapat memperpanjang berikut ekstensi untuk apa pun yang Anda perlu:
isValidPhoneNumber
,isValidPassword
dll ...sumber
NSRange
properti length harus digunakanString
utf16.count
sebagai ganticharacters.count
Di Swift 4.2 dan Xcode 10.1
Jika Anda ingin menggunakan SharedClass.
Dan memanggil fungsi seperti ini ....
sumber
Saya membuat perpustakaan yang dirancang untuk validasi input dan salah satu "modul" memungkinkan Anda untuk dengan mudah memvalidasi banyak hal ...
Misalnya untuk memvalidasi email:
SwiftCop adalah perpustakaan ... semoga membantu!
sumber
Berikut ini adalah ekstensi di Swift 3
Gunakan saja seperti ini:
sumber
Karena ada begitu banyak nama domain aneh tingkat atas sekarang, saya berhenti memeriksa panjang domain teratas ...
Inilah yang saya gunakan:
sumber
Tampaknya bekerja juga ...
sumber
Jawaban yang diperbarui @Arsonik menjawab Swift 2.2, menggunakan kode verbose lebih sedikit daripada solusi yang ditawarkan lainnya:
sumber
true
@Jawaban JeffersonBe dekat, tetapi kembali jika stringnya adalah "sesuatu yang mengandung email seseorang yang [email protected]" yang bukan yang kita inginkan. Berikut ini adalah ekstensi pada String yang berfungsi dengan baik (dan memungkinkan pengujian untuk nomor telepon yang valid dan detektor data lainnya untuk boot.sumber
Dan untuk Swift 3 :
sumber
Satu-satunya tambahan saya ke daftar tanggapan adalah bahwa untuk Linux,
NSRegularExpression
tidak ada, sebenarnyaRegularExpression
Ini berhasil dikompilasi di kedua macOS & Ubuntu.
sumber
Solusi terbaik dengan hasil terbaik untuk
sumber
Saya suka membuat ekstensi
pemakaian:
sumber
Cepat 5
Kemudian:
sumber
Regex sempurna seperti Google Email
sumber
Atau Anda dapat memiliki ekstensi untuk teks opsional UITextField:
Cara Penggunaan:
perpanjangan:
sumber