Jakie jest najprostsze wyrażenie regularne do weryfikacji wiadomości e-mail, aby nie akceptować ich ślepo? [Zamknięte]


80

Kiedy użytkownicy tworzą konto w mojej witrynie, chcę, aby serwer sprawdzał, czy e-maile nie przyjmują wszystkich danych wejściowych.

Wyślę potwierdzenie w taki sposób, aby potwierdzić poprawność uścisku dłoni .

Szukam czegoś prostego, nie najlepszego , ale niezbyt prostego, co niczego nie potwierdza. Nie wiem, gdzie musi znajdować się ograniczenie, ponieważ żadne wyrażenie regularne nie zapewni prawidłowego sprawdzenia poprawności, ponieważ nie można tego zrobić za pomocą wyrażeń regularnych.

Staram się ograniczyć sintax i wizualną złożoność właściwą dla wyrażeń regularnych, ponieważ w tym przypadku każdy będzie poprawny.

Jakiego wyrażenia regularnego mogę użyć, aby to zrobić?


Myśl „najprostsza” była dokładnie tak samo subiektywna jak „najlepsze”, ceteris paribus, a ten wątek zawierał róg obfitości wyrażeń regularnych, ale jeśli tak sądzisz ... wzruszając ramionami
Mihai Limbășan

Jeśli przeprowadzasz walidację wyrażenia regularnego, po co ograniczać wyrażenie do czegoś prostego? Użyjmy czegoś dobrego, nie będzie to miało wpływu na twój kod, zapewniając lepsze wyniki.
twk

Gdzie w twoim wniosku byłoby to zatwierdzenie? W POST? Co robisz, aby odkażać wkład?
Braiam

^ (? i) [A-Z0-9 + _.-] + @ (?:. *). (?:. *) $, ^ oznacza początek, $ oznacza koniec, (? i) dopasowanie bez uwzględniania wielkości liter. przed @ zezwalaj tylko na znaki alfanumeryczne, „+”, „_”, „-”. ten,?: bez częściowego dopasowania podgrupy, tylko 1 pełny mecz
P Satish Patro

Odpowiedzi:


99
^\S+@\S+$

3
To będzie pasować do nieprawidłowych adresów. Dowolne wyrażenie regularne będzie pasować do typowych błędów pisowni, takich jak test @ stackoverflow..com (zwróć uwagę na podwójne kropki). Podaj lepszy przykład.
Mihai Limbășan

62
Ma to być maksymalnie prosty, bardzo zgrubny filtr i nie rozumiem, dlaczego podwojone okresy są uprzywilejowane w stosunku do wszystkich innych błędów o podobnych kosztach złożoności, aby je pokryć.
chaos

2
+1. W każdym razie jest to subiektywne pytanie, a to jest proste.
Jason Cohen

2
Tak, jeśli nie chcesz używać pełnego wyrażenia regularnego walidacji, jest to dobre, proste przybliżenie
rampion

8
+1 Próba „zweryfikowania” adresu e-mail w pełni za pomocą wyrażenia regularnego to głupota. Działa to w celu wyłapania najprostszych błędnych typów; resztę można znaleźć, próbując wysłać wiadomość. Powyższe zezwala również na domeny Unicode (-> Punycode), gdzie większość „sprytnych” wyrażeń regularnych zawodzi.
bobince

239

Możliwe jest napisanie wyrażenia regularnego, które akceptuje tylko adresy e-mail zgodne ze standardami. Istnieją jednak adresy e-mail, które nie są ściśle zgodne ze standardami, ale nadal działają.

Oto kilka prostych wyrażeń regularnych do podstawowej weryfikacji:

Zawiera znak @:

@

Zawiera @ i kropkę gdzieś po nim:

@.*?\.

Ma co najmniej jeden znak przed @, przed kropką i po niej:

.+@.+\..+

Ma tylko jeden @, co najmniej jeden znak przed @, przed kropką i po niej:

^[^@]+@[^@]+\.[^@]+$

Użytkownik AmoebaMan17 sugeruje tę modyfikację w celu wyeliminowania białych znaków:

^[^@\s]+@[^@\s]+\.[^@\s]+$

Za zaakceptowanie tylko jednego okresu:

^[^@\s]+@[^@\s\.]+\.[^@\.\s]+$

7
JEŚLI przyjrzysz się temu, co nadchodzi z RFC 6531 i jeśli przyjrzysz się RFC 3696, prawdopodobnie dojdziesz do wniosku, że jedynym sposobem sprawdzenia wiadomości e-mail jest wysłanie wiadomości e-mail z potwierdzeniem. Myślę, że prawdziwy nacisk przy używaniu wyrażeń regularnych na adresach e-mail powinien polegać na pomaganiu użytkownikowi w zapobieganiu literówkom i właśnie w tym miejscu pojawiają się takie proste wyrażenia regularne.
Bob Barker,

Doskonale, @ AmoebaMan17. RegEx może zweryfikować format adresu e-mail, nie może zweryfikować zawartości adresu e-mail. To powiedziawszy, twój całkowicie zatwierdza format. Wysłanie wiadomości e-mail jest jedynym sposobem sprawdzenia treści.
Craig

nie będzie działać test@test.com?
Abdul Hameed,

1
Aby zapobiec kończeniu się ciągu kropką, wprowadziłem tę modyfikację: ^ [^ @ \ s] + @ [^ @ \ s] + \. [^ @ \. \ S] + $
fyrite

1
Tak, nie używaj ostatniego. Nie pasuje do wielu prawidłowych opcji. na przykład me@provider.co.uk.
s.meijer,

7

^ [a-zA-Z0-9 _. + -] + @ [a-zA-Z0-9 -] +. [a-zA-Z0-9 -.] + $

  • Tylko 1 @
  • Kilka domen i subdomen

3

Myślę, że ta mała poprawka do wyrażenia przez AmoebaMan17 powinna powstrzymać adres od rozpoczynania / kończenia się kropką, a także zatrzymanie wielu kropek obok siebie. Starając się nie komplikować sprawy ponownie, jednocześnie eliminując częsty problem.

(?!.*\.\.)(^[^\.][^@\s]+@[^@\s]+\.[^@\s\.]+$)

Wygląda na to, że działa (ale nie jestem ekspertem od RegEx). Rozwiązuje mój problem z kopiowaniem i wklejaniem przez użytkowników adresów e-mail na końcu zdań kończących się kropką.

tj .: Oto mój nowy adres e-mail tabby@coolforcats.com.


To nie działa dla jednej postaci przed @
Andy Hoyle

<script> alert ('hello') </script> @ hello.com jest poprawne zgodnie z tym wyrażeniem regularnym. Nie wydaje się w porządku.
dudedev

1

Wybieraj.

Oto ten, który jest zgodny z RFC 2822 sekcja 3.4.1 ...

(?:[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])+)\])

Na wszelki wypadek. :)


7
Uwaga dla każdego, kto teraz to widzi: To nie jest zgodne z RFC 2822.
porge

11
I to też nie jest proste :)
Dan Diplo,

2
Zablokuje również wiele prawidłowych adresów e-mail. Szczególnie te używające międzynarodowych znaków / języków.
Bob Barker,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.