Weryfikacja e-maili HTML5


102

Mówi się, że „W przypadku HTML5 nie potrzebujemy już js ani kodu po stronie serwera, aby sprawdzić, czy dane wejściowe użytkownika to prawidłowy adres e-mail lub adres URL”

Jak mogę zweryfikować e-mail po wejściu użytkownika? oraz bez JS, jak wyświetlić wiadomość, jeśli użytkownik poda nieprawidłową formę swojego adresu e-mail.

<input type="email" pattern="[^ @]*@[^ @]*" placeholder="Enter your email">
<input type="submit" value="Submit">

50
Zawsze musisz sprawdzić poprawność po stronie serwera. Sprytny klient może ominąć wszelkie środki bezpieczeństwa po stronie klienta.
Benjamin Gruenbaum

Ta odpowiedź może pomóc podczas próby skonfigurowania walidacji formularza HTML5. Oczywiście prawdopodobnie nadal będziesz potrzebować walidacji po stronie serwera.
Joeytje50

2
regex Email weryfikacja nigdy nie powinna być używana w żadnych okolicznościach. Kontrole Regex mają zbyt wiele błędów. Najlepszym sposobem „zweryfikowania” adresów e-mail jest po prostu poproszenie ich o dwukrotne wpisanie i uruchomienie sprawdzenia Regex, które daje OSTRZEŻENIE użytkownikowi, że nie wygląda na prawidłowy adres e-mail, jeśli nie pasuje do wzorca, oraz prosi użytkownika o dwukrotne sprawdzenie. W ten sposób, jeśli faktycznie jest poprawne, ale wyrażenie regularne zawodzi (jak to często bywa), użytkownik może po prostu potwierdzić, że wie, że jest prawidłowe i kontynuować. Zbyt wiele witryn używa weryfikacji wyrażeń regularnych i jest to frustrujące dla wielu użytkowników.
Soundfx4


Proszenie użytkownika o dwukrotne wprowadzenie tego samego adresu e-mail jest bezużyteczne. Jeśli nie znasz ich adresu e-mail, dwukrotne poproszenie o jego wpisanie nie poprawia kursów. Jeśli znają swój adres e-mail, dwukrotne poproszenie o jego wpisanie to po prostu kiepski interfejs użytkownika.
Mikko Rantalainen

Odpowiedzi:


120

W HTML5 możesz to zrobić:

<form>
<input type="email" placeholder="Enter your email">
<input type="submit" value="Submit">
</form>

Gdy użytkownik naciśnie przycisk Prześlij, automatycznie wyświetla komunikat o błędzie, taki jak:

Komunikat o błędzie


3
Jaka jest korzyść z tego wzoru? Określenie typu jako e-mail zawiera już wbudowany wzorzec, który to określa.
Rich Bradshaw

3
@RichBradshaw: Tak, masz rację. Nie trzeba określać wzoru (właśnie skopiowałem kod z OP, poprawiłem teraz :))
Midhun MP

6
@MichaelDeMutis: Możesz użyć requiredatrybutu
Midhun MP

29
wiadomość e-mail nie jest sprawdzana .comw wiadomości e-mail. Sprawdza tylko znak @. Dawny. Mogę wejść example@gmaili zapisać formularz. chociaż nie jest to prawidłowy adres e-mail. Czy istnieje obejście umożliwiające prawidłowe sprawdzenie example@gmail.com?
Ruchika

9
@Liz. example@gmailmoże nie być prawidłowym adresem e-mail, ale jest to prawidłowy format adresu e-mail.
pajaja,

47

input type=emailStronie www.w3.org notatek miejscu, że adres e-mail jest dowolny ciąg, który pasuje do następującego wyrażenia regularnego:

/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/

Użyj requiredatrybutu i patternatrybutu, aby wymagać, aby wartość pasowała do wzorca wyrażenia regularnego.

<input
    type="text"
    pattern="/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/"
    required
>

14
Musisz wstawić wzór bez dwóch znaków „/” oraz symbolu początku „^” i końca „$”. Tak jak to[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
Victor,

4
@Victor Przepraszamy, ale częściowo się mylisz. Te symbole są ważne bez nich wzór zacznie pasować wszędzie w ciągu i sprawi, że będzie bezużyteczny. Masz rację, to wypuszczanie cięć.
Hexodus

@Victor Twoja odpowiedź zadziałała dla mnie. Wyrażenie regularne OP dało mi fałszywie pozytywne stwierdzenie, aby spełnić wymagania formularza, nawet jeśli jest to prawidłowy adres e-mail. Być może chodzi o to, że nie używam zwykłego HTML, ale używam React JS do renderowania formularza HTML.
Ka Mok

Prawie przegłosowałem to, ponieważ poprawną odpowiedzią jest użycie type="email"i sprawdzenie validwłaściwości boolowskiej w DOMNode - nie ma potrzeby powtarzania podstawowego wyrażenia regularnego
Dominic

Dziękuję, że o tym wspomniałeś.
Stefan Ciprian Hotoleanu

17

Używanie [a-zA-Z0-9.-_]{1,}@[a-zA-Z.-]{2,}[.]{1}[a-zA-Z]{2,}do somemail@email.com/somemail@email.com.vn


4
To wyrażenie regularne nakłada szereg nieodpowiednich wymagań na adresy e-mail - na przykład odrzuca adresy e-mail z jedno- lub dwuliterową nazwą użytkownika lub hostowane pod jednoliterową nazwą domeny.
duskwuff

Edytowano. Dziękuję @duskwuff
Van Nguyen

Nadal odrzuca jednoliterowe nazwy domen.
duskwuff

Pozwala to na domeny z jedną literą / cyfrą: [a-zA-Z0-9.-_] {1,} @ [a-zA-Z0-9 .-] {1,} [.] {1} [a-zA -Z0-9] {2,}
Rudder

Zauważ również, że postmaster@aijest to na przykład prawidłowy adres e-mail, a to wyrażenie regularne również go zablokuje. (Źródło: serverfault.com/q/154991/104798 )
Mikko Rantalainen

12
document.getElementById("email").validity.valid

wydaje się być prawdą, gdy pole jest puste lub prawidłowe. Ma to również kilka innych interesujących flag:

wprowadź opis obrazu tutaj

Przetestowano w Chrome.


8

Oto przykład, którego używam dla wszystkich danych wejściowych e-mail w formularzu. Ten przykład to ASP.NET, ale ma zastosowanie do:

<asp:TextBox runat="server" class="form-control" placeholder="Contact's email" 
    name="contact_email" ID="contact_email" title="Contact's email (format: xxx@xxx.xxx)" 
    type="email" TextMode="Email" validate="required:true"
    pattern="[a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*" >
</asp:TextBox>

HTML5 nadal sprawdza poprawność przy użyciu wzorca, gdy nie jest to wymagane. Nie znalazłem jeszcze takiego, który byłby fałszywie pozytywny.

To renderuje się jako następujący HTML:

<input class="form-control" placeholder="Contact's email" 
    name="contact_email" id="contact_email" type="email" 
    title="Contact's email (format: xxx@xxx.xxx)" 
    pattern="[a-zA-Z0-9!#$%&amp;'*+\/=?^_`{|}~.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*">

7

Wiem, że nie jesteś zainteresowany rozwiązaniem Javascript, ale są pewne rzeczy, takie jak dostosowany komunikat walidacyjny, który z mojego doświadczenia można wykonać tylko za pomocą JS.

Ponadto, używając JS, możesz dynamicznie dodawać walidację do wszystkich pól wejściowych typu e-mail w Twojej witrynie, zamiast modyfikować każde pole wejściowe.

var validations ={
    email: [/^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/, 'Please enter a valid email address']
};
$(document).ready(function(){
    // Check all the input fields of type email. This function will handle all the email addresses validations
    $("input[type=email]").change( function(){
        // Set the regular expression to validate the email 
        validation = new RegExp(validations['email'][0]);
        // validate the email value against the regular expression
        if (!validation.test(this.value)){
            // If the validation fails then we show the custom error message
            this.setCustomValidity(validations['email'][1]);
            return false;
        } else {
            // This is really important. If the validation is successful you need to reset the custom error message
            this.setCustomValidity('');
        }
    });
})

Prosimy nie publikować tylko odpowiedzi na linki. Po prostu umieść najważniejsze części linku w swojej odpowiedzi
Rizier123,

5

Trochę za późno na imprezę, ale to wyrażenie regularne pomogło mi sprawdzić poprawność danych wejściowych typu e-mail po stronie klienta. Chociaż zawsze powinniśmy również przeprowadzać weryfikację po stronie serwera.

<input type="email" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">

Można znaleźć więcej regex wszystkich rodzajów tutaj .


4

TL; DR: Jedyną w 100% poprawną metodą jest sprawdzenie @ -sign gdzieś we wprowadzonym adresie e-mail, a następnie wysłanie wiadomości weryfikacyjnej na podany adres e-mail. Jeśli mogą postępować zgodnie z instrukcjami weryfikacji zawartymi w wiadomości e-mail , wprowadzony adres e-mail jest poprawny.

Długa odpowiedź:

David Gilbertson pisał o tym lata temu:

Musimy zadać dwa pytania:

  1. Czy użytkownik zrozumiał, że powinien wpisać adres e-mail w tym polu?
  2. Czy użytkownik poprawnie wpisał swój adres e-mail w tym polu?

Jeśli masz dobrze rozplanowany formularz z etykietą z napisem „e-mail”, a użytkownik wprowadza gdzieś symbol „@”, można śmiało powiedzieć, że zrozumiał, że powinien wprowadzać adres e-mail. Łatwo.

Następnie chcemy przeprowadzić weryfikację, aby upewnić się, czy poprawnie wprowadzili swój adres e-mail.

Niemożliwe.

[…]

Każdy błąd z pewnością spowoduje nieprawidłowy adres e-mail, ale może tylko skutkować nieprawidłowym adresem e-mail.

[…]

Nie ma sensu próbować dowiedzieć się, czy adres e-mail jest „prawidłowy”. Prawdopodobieństwo, że użytkownik wprowadzi nieprawidłowy i prawidłowy adres e-mail, jest dużo większe niż wprowadzenie nieprawidłowego .

Innymi słowy, należy zauważyć, że każdy rodzaj walidacji opartej na ciągach znaków może tylko sprawdzić, czy składnia jest nieprawidłowa. Nie może sprawdzić, czy użytkownik rzeczywiście widzi e-mail (np. Ponieważ użytkownik utracił już dane uwierzytelniające, wpisał adres kogoś innego lub wpisał służbowy adres e-mail zamiast osobistego adresu e-mail dla danego przypadku użycia). Jak często pytanie, którego naprawdę szukasz, brzmi: „Czy ten e-mail jest poprawny pod względem składniowym ” zamiast „Czy mogę komunikować się z użytkownikiem przy użyciu podanego adresu e-mail ”? Jeśli zweryfikujesz ciąg bardziej niż „zawiera @”, próbujesz odpowiedzieć na poprzednie pytanie! Osobiście zawsze interesuje mnie tylko to drugie pytanie.

Ponadto niektóre adresy e-mail, które mogą być niepoprawne pod względem składniowym lub politycznym, działają. Na przykład postmaster@aidziała technicznie, mimo że domeny TLD nie powinny mieć rekordów MX . Zobacz także dyskusję na temat walidacji wiadomości e-mail na liście mailingowej WHATWG (gdzie HTML5 jest zaprojektowany w pierwszej kolejności).


2

Używając HTML 5, po prostu wprowadź wejściowy e-mail, taki jak:

<input type="email"/>

Gdy użytkownik najedzie kursorem na pole wprowadzania, pojawi się podpowiedź z instrukcją, aby wprowadzić prawidłowy adres e-mail. Jednak formularze Bootstrap mają znacznie lepszą wiadomość Tooltip, która mówi użytkownikowi, aby wprowadzić adres e-mail i pojawia się, gdy wprowadzona wartość nie pasuje do prawidłowego adresu e-mail.


Nie unieważnia to jednak przypadków takich jak „abc @ gmail”.
nbsamar

Tak, myślę, że tak, chciałbym valide, jeśli użytkownik umieści Gmaila lub Hotmaila, na przykład, jeśli mój użytkownik umieścił inne, nie pozwól mu kontynuować logowania, czy wiesz, jak mogę to zrobić?
simon

2

Możesz również podążać za tym wzorem

<form action="/action_page.php">
  E-mail: <input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$">
  <input type="submit">
</form>

Ref: W W3Schools


1
<input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" title="please enter valid email [test@test.com].">możesz również dodać tytuł, aby wyświetlić komunikat o ważności.
imdzeeshan

1

Według MDN ten RegExp jest w porządku do weryfikacji wiadomości e-mail, ponieważ wiadomości e-mail spełniające specyfikacje powinny do niego pasować.

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}
  [a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

0

Prawidłowe sprawdzenie poprawności wiadomości e-mail po prostu przy użyciu atrybutu HTML5 „wzorzec” jest bardzo trudne. Jeśli nie użyjesz „wzorca”, ktoś @ zostanie przetworzony. który NIE jest prawidłowym adresem e-mail.

Użycie pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"będzie wymagało someone@email.compodania formatu, jednak jeśli nadawca ma format taki jak someone@email.net.au(lub podobny), nie zostanie zweryfikowany w celu naprawienia tego, możesz umieścić pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}"to, aby sprawdzić poprawność ".com.au lub .net.au lub podobnie.

Jednak użycie tego nie pozwoli komuś@email.com na weryfikację. Tak więc, jeśli chodzi o zwykłe używanie HTML5 do weryfikacji adresów e-mail, nadal nie jest to całkowicie z nami. Aby to ukończyć, użyłbyś czegoś takiego:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

lub:

<form>
<input id="email" type="text" name="email" pattern="[a-zA-Z]{3,}@[a-zA-Z]{3,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,}" required placeholder="Enter you Email">
<br>
<input type="submit" value="Submit The Form">
</form>

Jednak nie wiem, jak zweryfikować obie lub wszystkie wersje adresów e-mail za pomocą atrybutu wzorca HTML5.


1
W żadnych okolicznościach nie należy używać sprawdzania wyrażeń regularnych. Jest zbyt wiele wzorów i ma zbyt wiele wad. Na przykład, osoba+customwordhere@email.com jest uważana za nieprawidłową w wielu sprawdzeniach wyrażeń regularnych, podczas gdy w rzeczywistości jest w 100% poprawna. Regex jest solą w oku i dla wielu innych użytkowników i musi odejść. Należy użyć alternatywnej metody, aby upewnić się, że użytkownik wprowadza prawidłowy adres e-mail.
Soundfx4

Zauważ również, że postmaster@aijest to na przykład prawidłowy adres e-mail, a to wyrażenie regularne również go zablokuje. (Źródło: serverfault.com/q/154991/104798 )
Mikko Rantalainen

Narzędzie do weryfikacji poczty e-mail, takie jak DeBounce, jest również zalecane wraz z HTML5.
Iman Hejazi
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.