Apa praktik terbaik untuk memvalidasi alamat email di iOS 2.0

167

Apa cara terbersih untuk memvalidasi alamat email yang dimasukkan pengguna di iOS 2.0?

CATATAN : Ini adalah pertanyaan historis yang khusus untuk iOS 2.0 dan karena usianya dan berapa banyak pertanyaan lain yang dikaitkan dengannya, ia tidak dapat dibatalkan dan TIDAK HARUS diubah menjadi pertanyaan "modern".

Marcus S. Zarra
sumber
Saya mencari solusi kakao. Saya memahami validitas email dan aturan seputar validasi email. Namun karena RegEx tidak mudah diakses di Cocoa Touch, saya mencari solusi Cocoa Touch untuk validasi. Bukan daftar aturan seputar validasi.
Marcus S. Zarra
Sejauh ini saran kode terbaik yang saya temukan adalah menggunakan RegExKitLite dan ekspresi reguler. Untungnya itu tidak terlalu menyakitkan daripada kedengarannya.
Marcus S. Zarra
Lihat komentar di bawah tentang penggunaan NSRegularExpression untuk aplikasi yang tidak mendukung os <4.0.
Pada
1
Karena ini tampaknya menjadi pertanyaan kanonik mengenai validasi alamat email, masuk akal untuk memperbarui dengan jawaban yang lebih baik seiring iOS matang. Dengan mengingat hal itu, saya telah menambahkan jawaban yang menggunakan iOS NSDataDetectoruntuk memvalidasi alamat email: stackoverflow.com/a/23547905/257550
memmons
2
Pertanyaan ini tampaknya di luar topik karena ini tentang iOS 2.0 yang sudah usang beberapa tahun yang lalu.
Nathan Eror

Jawaban:

354

Jawaban untuk Menggunakan ekspresi reguler untuk memvalidasi alamat email menjelaskan dengan sangat rinci bahwa tata bahasa yang ditentukan dalam RFC 5322 terlalu rumit untuk ekspresi reguler primitif.

Saya merekomendasikan pendekatan pengurai nyata seperti MKEmailAddress .

Sebagai solusi ekspresi reguler cepat, lihat modifikasi DHValidation ini :

- (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];
}
Catlan
sumber
9
Hebat tetapi tidak berfungsi pada OS <3.0, karena NSPredicate tidak tersedia.
Felixyz
4
Bagus. Semua orang lupa bahwa NSPredicate dapat menjalankan regexps.
Rog
5
Itu adalah regexp yang sangat buruk. Misalnya, ini akan gagal pada orang yang menggunakan domain teratas .museum. Rujuk ke artikel ini: linuxjournal.com/article/9585
Jonny
18
Ada regex yang lebih lengkap di cocoawithlove.com/2009/06/... yang dapat digunakan sebagai pengganti yang sederhana ini.
Tomas Andrle
12
Berikut ini adalah regex email yang sangat naif namun liberal sebagai string Kakao: @"[^@]+@[^.@]+(\\.[^.@]+)+"Jika Anda perlu memverifikasi alamat email, kirimkan pesan kepadanya dan lihat apakah berhasil. Anda tidak akan pernah memverifikasinya dengan tingkat akurasi apa pun hanya dengan regex, jadi sebaiknya jangan kencing pengguna dan kehilangan pendaftaran karena regex ketat yang tidak perlu.
Sami Samhuri
20

Baca RFC. Hampir semua orang yang mengira mereka tahu cara mengurai / membersihkan / memvalidasi alamat email salah.

http://tools.ietf.org/html/rfc2822 Bagian 3.4.1 sangat berguna. Memperhatikan

dtext = NO-WS-CTL /; Kontrol ruang bukan putih

                        % d33-90 /; Sisa AS-ASCII
                        % d94-126; karakter tidak termasuk "[",
                                        ; "]", atau "\"

Ya, itu berarti +, ', dll semuanya sah.

Angka tiga
sumber
Saat ini pada Mei 2016: RFC5322, bagian 3.4.1
leanne
17

Solusi terbaik yang saya temukan sejauh ini (dan yang akhirnya saya ikuti) adalah menambahkan RegexKitLite ke proyek yang memberikan akses ke ekspresi reguler melalui NSString Categories.

Sangat mudah untuk menambahkan ke proyek dan sekali di tempat, salah satu logika validasi email ekspresi reguler akan bekerja.

Marcus S. Zarra
sumber
5
NSPredicate dapat melakukan RegEx tanpa menambahkan pustaka tambahan ke proyek Anda.
BadPirate
10
Pertanyaan ini, mulai April 2009 sebelum NSPredicate ada di iOS.
Marcus S. Zarra
7
Sekali lagi, NSRegularExpression TIDAK BERLAKU di iOS 2.0 ketika pertanyaan ini diajukan.
Marcus S. Zarra
9
@Marcus, maksud dari Stack Overflow bukanlah untuk memelihara catatan sejarah tentang bagaimana masalah tertentu diselesaikan di masa lalu. Yang mengatakan, saya telah mengedit pertanyaan Anda untuk menekankan sudut kompatibilitas 2.0.
benzado
2
Silakan baca judulnya, ini untuk iOS 2.0 dimana solusi Catlan tidak ada.
Marcus S. Zarra
10

Awal yang baik adalah memutuskan apa yang Anda dan Anda tidak ingin terima sebagai alamat email?

99% dari alamat email terlihat seperti ini: [email protected] atau [email protected]

Namun, secara teknis sah memiliki alamat email seperti ini: f !#$%&'*+-/=?^_{|} ~ "ha!" @ Com

Mungkin hanya ada segelintir email yang valid di dunia untuk domain tingkat atas, dan hampir tidak ada yang menggunakan sebagian besar karakter lain (terutama kutipan dan backticks), jadi Anda mungkin ingin berasumsi bahwa ini semua adalah hal yang tidak valid untuk dilakukan. Tetapi Anda harus melakukannya sebagai keputusan sadar.

Di luar itu, lakukan apa yang dikatakan Paul dan cobalah untuk mencocokkan input ke ekspresi reguler seperti ini: ^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] +. [AZ] { 2,} $

Yang itu akan cocok dengan alamat email semua orang.

Brandon Yarbrough
sumber
Meskipun jawaban ini ditulis pada tahun 2009, masih muncul sangat tinggi dalam hasil pencarian. saya hanya ingin menambahkan bahwa ini tidak lagi terkini dan regex di atas agak membatasi. misalnya, sekarang Anda dapat memiliki 4 digit atau lebih domain tingkat atas
Jack
Poin bagus, edit ke "setidaknya 2 digit". Silakan mengedit lebih lanjut jika Anda mau.
Brandon Yarbrough
7

Meskipun fokus pada ekspresi reguler baik, tetapi ini hanya langkah pertama dan perlu. Ada langkah-langkah lain yang juga perlu diperhitungkan untuk strategi validasi yang baik.

Dua hal di atas kepala saya adalah:

  1. Validasi DNS untuk memastikan domain benar-benar ada.

  2. Setelah validasi dns, Anda juga dapat memilih untuk melakukan validasi smtp. mengirim panggilan ke server smtp untuk melihat apakah pengguna benar-benar ada.

Dengan cara ini Anda dapat menangkap semua jenis kesalahan pengguna dan memastikan itu adalah email yang valid.

Srikar Doddi
sumber
7

Fungsi ini sederhana namun memeriksa alamat email lebih teliti. Misalnya, menurut RFC2822 alamat email tidak boleh berisi dua periode berturut-turut, seperti nama depan..lastname @ domain..com

Penting juga untuk menggunakan jangkar dalam ekspresi reguler seperti yang terlihat dalam fungsi ini. Tanpa jangkar, alamat email berikut ini dianggap valid: pertama; nama) [email protected] (bla karena bagian [email protected] valid, abaikan dulu; nama) di awal dan (bla pada akhirnya. Jangkar memaksa mesin ekspresi reguler untuk memvalidasi seluruh email.

Fungsi ini menggunakan NSPredicate yang tidak ada di iOS 2. Sayangnya itu mungkin tidak membantu penanya, tetapi mudah-mudahan akan membantu orang lain dengan versi iOS yang lebih baru. Ekspresi reguler dalam fungsi ini masih dapat diterapkan ke RegExKitLite di iOS 2. Dan bagi mereka yang menggunakan iOS 4 atau lebih baru, ekspresi reguler ini dapat diimplementasikan dengan 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];
}

Lihat memvalidasi alamat email menggunakan ekspresi reguler di Objective-C .

Kutu buku
sumber
iOS 2.0 tidak memiliki NSPredicate.
Marcus S. Zarra
2
Tapi apa gunanya pertanyaan ini dan apa gunanya ios 2. Kami memiliki os terbaru yaitu ios 7.1. Anda juga dapat menggunakan ios 6.
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:@"[email protected] 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. 
hirak
sumber
4

Saya telah menemukan bahwa menggunakan ekspresi reguler berfungsi sangat baik untuk memvalidasi alamat email.

Kelemahan utama untuk ekspresi reguler tentu saja adalah rawatan, jadi komentar seperti Anda belum pernah berkomentar sebelumnya. Saya berjanji kepada Anda, jika tidak, Anda akan berharap Anda melakukannya ketika Anda kembali ke ekspresi setelah beberapa minggu.

Berikut ini tautan ke sumber yang bagus, http://www.regular-expressions.info/email.html .

Paul Redman
sumber
Saya menerapkan yang kedua terakhir di halaman itu baru-baru ini, dan saya cukup senang dengannya. Ini berfungsi dengan baik untuk alamat email [email protected] sederhana, tanpa tanda kutip atau tanda kurung untuk nama lengkap. Berfungsi bagus untuk validasi formulir web di mana orang tidak akan mengetik hal semacam itu.
zombat
2
Orang miskin dengan .museum TLD mereka.
BadPirate
3

Menggali tanah, tapi saya hanya menemukan SHEmailValidator yang melakukan pekerjaan sempurna dan memiliki antarmuka yang bagus.

Cyrille
sumber
Pertanyaan ini khusus untuk iOS 2.0 yang tidak memiliki NSPredicate atau sejumlah hal lain yang sedang digunakan di perpustakaan itu.
Marcus S. Zarra
1
Saya tahu, tetapi saya mendarat di sini lebih dulu saat mencari "validasi email ios". Mungkin beberapa masa depan saya akan melakukan pencarian yang sama dan mendarat di sini dan itu akan menghemat waktu.
Cyrille
1

Banyak situs web menyediakan RegExes tetapi Anda sebaiknya mempelajari dan memahaminya serta memverifikasi apa yang Anda inginkan memenuhi kebutuhan Anda dalam RFC resmi untuk format alamat email.

Untuk mempelajari RegEx, bahasa yang ditafsirkan dapat menjadi penyederhanaan dan testbed yang bagus. Rubular dibangun di atas Ruby, tetapi cara cepat yang baik untuk menguji dan memverifikasi: http://www.rubular.com/

Di luar itu, beli edisi terbaru buku O'Reilly Menguasai Ekspresi Reguler. Anda akan ingin meluangkan waktu untuk memahami 3 atau 4 bab pertama. Semuanya setelah itu akan membangun keahlian pada penggunaan RegEx yang sangat dioptimalkan.

Seringkali serangkaian RegExes yang lebih kecil dan lebih mudah dikelola lebih mudah dikelola dan didebug.

pengguna656483
sumber
0

Berikut ini adalah ekstensi dari String yang memvalidasi email di Swift.

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

Disalin dari jawaban untuk: Periksa apakah alamat email itu valid di iOS

InnisBrendan
sumber
Tidak ada NSPredicatedi iOS 2.0
Marcus S. Zarra
-2

Anda seharusnya tidak mencoba menggunakan regex untuk memvalidasi email. Dengan TLD yang terus berubah, validator Anda tidak lengkap atau tidak akurat. Sebaliknya, Anda harus memanfaatkan NSDataDetectorperpustakaan Apple yang akan mengambil string dan mencoba untuk melihat apakah ada bidang data yang diketahui (email, alamat, tanggal, dll). SDK Apple akan melakukan banyak hal untuk tetap mengikuti perkembangan TLD dan Anda dapat mendukung upaya mereka !! :)

Selain itu, jika iMessage (atau bidang teks lainnya) tidak menganggapnya sebagai email, haruskah Anda mempertimbangkan email?

Saya menempatkan fungsi ini dalam NSStringkategori, jadi string yang Anda uji adalah 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]]);
}

atau sebagai Stringekstensi cepat

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)"
    }
}
Tuan T
sumber
1
Pertanyaan ini dari DELAPAN tahun yang lalu.
Marcus S. Zarra
1
Namun, jika Anda Google validate email objective-c, pertanyaan ini adalah hasil ketiga. Beberapa hal di internet tidak menua. :-)
Craig Otis
1
Harap hentikan tautan spam ke jawaban ini di bawah setiap pos yang dapat Anda temukan yang terkait dengan memvalidasi alamat email. Komentar untuk meminta klarifikasi, bukan untuk tautan spam ke jawaban Anda.
meagar
BTW, NSDataDetectorTIDAK ada di iOS 2.0 yang merupakan pertanyaan ini.
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;
}
Gaurav Gilani
sumber
3
Utas / pertanyaan ini untuk iOS 2. NSPredicatetidak ada di iOS 2; itu tidak ditambahkan sampai iOS 3.
Marcus S. Zarra
3
Saya menjawab karena jawaban Anda salah. Pertanyaannya adalah "bagaimana Anda melakukannya X pada iOS Y" dan Anda menjawab dengan kerangka kerja yang tidak ada pada versi iOS itu.
Marcus S. Zarra