Modül dersleri (1/4)
Bir e-postayı doğrulama
Bir e-postayı "doğru" şekilde doğrulamak göründüğünden çok daha zor bir sorundur: RFC 5322 bir canavardır. Uygulamada yeterince iyi bir model seçiyoruz: Yaygın vakaları kabul eder ve açıkça yanlış olanları reddeder.
Pattern: ^[\w.+-]+@[\w-]+(?:\.[\w-]+)+$[\w.+-]+-- yerel kısım: harfler, rakamlar,_,.,+,-.@-- ayırıcı.[\w-]+(?:\.[\w-]+)+-- alan adı +.ile ayrılmış en az bir TLD.
Kabul ettiği şeyler: mario.rossi@example.com, foo+bar@sub.example.co.uk,
user_123@test-domain.io.
Neyi reddeder: mario@, @example.com, mario@example (TLD yok), boşluklar.
Takaslar
Yukarıdaki model şunları kabul etmez:
- Alıntılanan dizeler
"strange (things)"@example.com(RFC bunlara izin verir). - Unicode karakterli alan adları (
\u00fcber@m\u00fcnchen.de). \wdeğerini geçmeyen çok uzun TLD'ler (ör. uluslararası hale getirilmiş olanlar).
Bunlara ihtiyacınız varsa sınıfı u bayrağıyla \p{L} olarak genişletin veya
uzmanlaşmış kütüphane.
E-posta doğrulama için ödünleşimler ve en iyi uygulamalar
Hiçbir normal ifade bir e-posta adresinin gerçekten var olduğunu garanti edemez. Aşırı karmaşık modeller performansı düşürür ve olağandışı ancak geçerli alanları hariç tutar. Açık yazım hatalarını reddetmek ve bir doğrulama kodu göndermek için basit bir doğrulama modeli kullanmak daha iyidir.
Deneyin
Metindeki her e-postayı tanıyın. Basit bir kalıp kullanın: @'den önce harfler/rakamlar/noktalar, en az bir nokta içeren alan adı.
İpucu göster
Birden fazla TLD'yi kabul etmek için yerel kısmı [\\w.+-]+ olarak ve etki alanını da [\\w-]+\\.[\\w.-]+ olarak genişletin.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
Her e-postanın etki alanını (@'dan sonraki kısım) adlandırılmış bir grup `dominio' olarak yakalayın.
İpucu göster
Etki alanı bölümünü adlandırılmış bir gruba sarın: (?<dominio>[\\w.-]+).
3 denemeden sonra çözüm mevcut
Ek zorluk
Find the domain part of an email (everything after `@`), excluding the `@` sign using lookbehind.
İpucu göster
Etki alanı karakter sınıfının önünde pozitif bir geriye bakış (?<=@) kullanın.
3 denemeden sonra çözüm mevcut