Lekcje modułu (1/4)
Walidacja adresu e-mail
„Prawidłowa” walidacja adresu e-mail to znacznie trudniejszy problem, niż się wydaje: standard RFC 5322 to prawdziwy potwór. W praktyce wybieramy wzorzec wystarczająco dobry, który akceptuje typowe przypadki i odrzuca te ewidentnie błędne.
Pattern: ^[\w.+-]+@[\w-]+(?:\.[\w-]+)+$[\w.+-]+-- część lokalna: litery, cyfry,_,.,+,-.@-- separator.[\w-]+(?:\.[\w-]+)+-- domena + co najmniej jedna domena najwyższego poziomu (TLD) rozdzielone kropką..
Co akceptuje: mario.rossi@example.com, foo+bar@sub.example.co.uk, user_123@test-domain.io.
Co odrzuca: mario@, @example.com, mario@example (brak TLD), spacje.
Kompromisy
Powyższy wzorzec nie akceptuje:
- Ciągów w cudzysłowach
"strange (things)"@example.com(RFC na to zezwala). - Domen ze znakami Unicode (
\u00fcber@m\u00fcnchen.de). - Bardzo długich TLD, które nie pasują do klasy
\w(np. domen międzynarodowych).
Jeśli ich potrzebujesz, rozszerz klasę znaków do \p{L} z flagą u lub skorzystaj ze specjalistycznej biblioteki.
Kompromisy i najlepsze praktyki w walidacji e-maili
Żadne wyrażenie regularne nie gwarantuje, że adres e-mail rzeczywiście istnieje. Zbyt skomplikowane wzorce obniżają wydajność i wykluczają nietypowe, ale poprawne domeny. Lepiej zastosować prosty wzorzec walidacji, aby odrzucić oczywiste błędy, i wysłać kod weryfikacyjny.
Spróbuj sam
Rozpoznaj każdy adres e-mail w tekście. Użyj prostego wzorca: litery/cyfry/kropki przed znakiem @, domena z co najmniej jedną kropką.
Pokaż wskazówkę
Rozszerz część lokalną do [\w.+-]+ oraz domenę do [\w-]+\.[\w.-]+, aby akceptować wiele domen najwyższego poziomu (TLD).
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
Przechwyć domenę (część po znaku @) każdego adresu e-mail jako grupę nazwaną `dominio`.
Pokaż wskazówkę
Otocz część domenową grupą nazwaną: (?<dominio>[\w.-]+).
Rozwiązanie dostępne po 3 próbach
Dodatkowe wyzwanie
Znajdź część domenową adresu e-mail (wszystko po `@`), wykluczając znak `@` za pomocą asercji lookbehind.
Pokaż wskazówkę
Użyj pozytywnego lookbehind (?<=@) przed klasą znaków domeny.
Rozwiązanie dostępne po 3 próbach