HTML5 Email input pattern atrybut
Próbuję utworzyć formularz html5, który zawiera jedno wejście e-mail, jedno wejście pole wyboru i jedno wejście wyślij. Próbuję użyć atrybutu pattern do wprowadzania wiadomości e-mail, ale nie wiem, co umieścić w tym atrybutie. Wiem, że powinienem użyć wyrażenia regularnego, które musi pasować do produkcji wzorca JavaScript, ale nie wiem, jak to zrobić.
Staram się, aby ten atrybut zrobił to sprawdzić, aby upewnić się, że e-mail zawiera jeden @ i na przynajmniej jedna lub więcej kropek i jeśli to możliwe sprawdź, czy adres po znaku @ jest prawdziwym adresem. Jeśli nie mogę tego zrobić za pomocą tego atrybutu, rozważę użycie JavaScript, ale do sprawdzania jednego @ i jednej lub więcej kropek chcę użyć atrybutu pattern na pewno.
Atrybut pattern musi sprawdzić:
- Only one @
- jedna lub więcej kropek
- i jeśli to możliwe sprawdź, czy adres PO @ jest prawidłowym adresem
Alternatywa dla ten jest użycie JavaScript, ale dla wszystkich innych warunków nie chcę używać JavaScript.
18 answers
Jest to podwójny problem (jak wiele w świecie world wide web).
Musisz ocenić, czy przeglądarka obsługuje html5(do tego używam Modernizr). W takim przypadku, jeśli masz normalny formularz, przeglądarka wykona zadanie za ciebie, ale jeśli potrzebujesz ajax / json(jak wiele codziennych przypadków), musisz I tak wykonać ręczną weryfikację.
.. tak więc, moja sugestia jest użycie wyrażenia regularnego do oceny w dowolnym momencie przed przesłaniem. Wyrażenie, którego używam jest następujące:
var email = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
To jeden pochodzi z http://www.regular-expressions.info / . Jest to trudny świat do zrozumienia i opanowania, dlatego proponuję uważnie przeczytać tę stronę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-29 21:48:20
Miałem dokładnie ten problem z html5s e-mail input, używając Alwin Keslers odpowiedź powyżej dodałem regex do HTML5 e-mail input więc użytkownik musi mieć .coś na końcu.
<input type="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 11:57:48
Niestety, wszystkie sugestie z wyjątkiem B-Money są nieważne w większości przypadków.
Tutaj jest wiele ważnych e-maili, takich jak:
- gü[email protected] (niem. umlaut)
- антон@россия.рф (rosyjski, рф jest poprawną domeną)
- Chiński i wiele innych języków (patrz na przykład Międzynarodowy e-mail i powiązane specyfikacje).
Ze względu na złożoność, aby uzyskać poprawność walidacji, proponuję bardzo ogólne rozwiązanie:
<input type="text" pattern="[^@\s]+@[^@\s]+\.[^@\s]+" title="Invalid email address" />
Sprawdza czy email zawiera co najmniej jeden znak (również numer lub cokolwiek z wyjątkiem innego "@" lub białej spacji) przed "@", co najmniej dwa znaki (lub cokolwiek z wyjątkiem innego "@" lub białej spacji) po "@" i jedną kropkę pomiędzy. Ten wzorzec nie akceptuje adresów takich jak lol@company, czasami używanych w sieciach wewnętrznych. Ale ten może być użyty, jeśli jest to wymagane:
<input type="text" pattern="[^@\s]+@[^@\s]+" title="Invalid email address" />
Oba wzorce akceptują również mniej poprawne e-maile, na przykład e-maile z pionową zakładką. Ale dla mnie to wystarczy. Silniejsze kontrole jak próba połączenia z serwerem pocztowym lub domeną ping powinna się zdarzyć po stronie serwera.
BTW, właśnie napisałem angular directive (jeszcze nie przetestowany) do walidacji e-maili z novalidate
i bez wzorca powyżej do obsługi DRY-principle:
.directive('isEmail', ['$compile', '$q', 't', function($compile, $q, t) {
var EMAIL_PATTERN = '^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$';
var EMAIL_REGEXP = new RegExp(EMAIL_PATTERN, 'i');
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel){
function validate(value) {
var valid = angular.isUndefined(value)
|| value.length === 0
|| EMAIL_REGEXP.test(value);
ngModel.$setValidity('email', valid);
return valid ? value : undefined;
}
ngModel.$formatters.unshift(validate);
ngModel.$parsers.unshift(validate);
elem.attr('pattern', EMAIL_PATTERN);
elem.attr('title', 'Invalid email address');
}
};
}])
Użycie:
<input type="text" is-email />
Dla B-Money wzór jest " @ " wystarczy. Ale odrzuca dwa lub więcej " @ " i wszystkie spacje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-03 12:02:39
W HTML5 możesz użyć nowego typu 'email': http://www.w3.org/TR/html-markup/input.email.html
Na przykład:
<input type="email" id="email" />
Jeśli przeglądarka implementuje HTML5, upewni się, że użytkownik wprowadził prawidłowy adres e-mail w polu. Zauważ, że jeśli przeglądarka nie zaimplementuje HTML5, będzie traktowana jak typ "tekstowy", czyli:
<input type="text" id="email" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-26 10:04:00
<input name="email" type="email" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{1,63}$" class="form-control" placeholder="Email*" id="email" required="">
Jest to zmodyfikowana wersja powyższego rozwiązania, które również akceptują wielką literę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 20:20:43
Oto podejście, którego używam i możesz je modyfikować w zależności od swoich potrzeb:
^[\w]{1,}[\w.+-]{0,}@[\w-]{2,}([.][a-zA-Z]{2,}|[.][\w-]{2,}[.][a-zA-Z]{2,})$
Wyjaśnienie:
-
Chcemy mieć pewność, że adres e-mail zawsze zaczyna się od słowa:
^[\w]
Słowo to dowolny znak, cyfra lub podkreślenie. Możesz użyć wzoru [a-zA-Z0-9_], ale da ci to ten sam wynik i jest dłuższy.
-
Następnie chcemy się upewnić, że istnieje przynajmniej jeden taki postać:
^[\w]{1,}
-
Następnie chcemy zezwolić na dowolne słowo, cyfrę lub znaki specjalne w nazwie. W ten sposób możemy być pewni, że e-mail nie zaczyna się od kropki, ale może zawierać kropkę na innej pozycji niż pierwsza:
^[\w]{1,}[\w.+-]
-
I oczywiście nie musi być żadnego takiego znaku, ponieważ adres e-mail może mieć tylko jedną literę, po której następuje @:
^[\w] {1,} [\w.+-]{0,}
-
Następnie potrzebujemy znaku@, który jest obowiązkowy, ale może być tylko jeden w całym e-mailu:
^[\w] {1,} [\w.+-]{0,}@
-
Zaraz za znakiem @ chcemy nazwę domeny. Tutaj możesz określić, ile znaków chcesz jako minimum i z jakiego zakresu znaków. Wybrałbym wszystkie znaki słowne łącznie z myślnikiem [\w -] i chcę przynajmniej dwa z nich {2,}. Jeśli chcesz zezwolić na domeny takie jak t.co , musiałbyś zezwolić na jeden znak z tego zakresu {1,}:
^[\w] {1,} [\w.+-]{0,}@[\w-]{2,}
-
Następnie musimy zająć się dwoma sprawami. Albo jest tylko nazwa domeny, po której następuje rozszerzenie domeny, albo nazwa subdomeny, po której następuje nazwa domeny, a następnie rozszerzenie, na przykład abc.com kontra abc.co.uk . aby to zadziałało, potrzebujemy aby użyć tokenu (A|b) gdzie a oznacza pierwszy przypadek, b oznacza drugi przypadek i | oznacza logiczne lub. W pierwszym przypadku zajmiemy się tylko rozszerzeniem domeny, ale ponieważ będzie ona zawsze tam, bez względu na przypadek, możemy bezpiecznie dodać ją do obu przypadków:
^[\w] {1,} [\w.+-]{0,}@[\w-]{2,}([.] [a-zA-Z]{2,} / [.] [a-zA-Z]{2,})
Ten wzór mówi, że potrzebujemy dokładnie jednego znaku kropki, po którym następuje litery, bez cyfr, i chcemy przynajmniej dwie z nich, w obu przypadkach.
-
W drugim przypadku dodamy nazwę domeny przed rozszerzeniem domeny, czyniąc w ten sposób oryginalną nazwę domeny subdomeną:
^[\w] {1,} [\w.+-]{0,}@[\w -] {2,} ([.] [a-zA-Z]{2,}|[.] [\w-]{2,}[.] [a-zA-Z]{2,})
Nazwa domeny może składać się ze znaków słowa, w tym myślnika i ponownie, chcemy co najmniej dwa znaki tutaj.
-
Wreszcie, musimy zaznaczyć koniec całego wzoru:
^[\w] {1,} [\w.+-]{0,}@[\w -] {2,} ([.] [a-zA-Z]{2,} / [.] [\w -] {2,} [.] [a-zA-Z]{2,})$
Przejdź tutaj i sprawdź, czy twój e-mail pasuje do wzorca: https://regex101.com/r/374XLJ/1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-23 05:11:18
Pewnie chcesz czegoś takiego. Zwróć uwagę na atrybuty:
- wymagane
- type=email
- autofocus
- Wzór
<input type="email" value="" name="EMAIL" id="EMAIL" placeholder="[email protected]" autofocus required pattern="[^ @]*@[^ @]*" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 05:06:51
Użyłem następujących wyrażeń regularnych, aby zaspokoić następujące e-maile.
[email protected] # Minimum three characters
[email protected] # Accepts Caps as well.
[email protected] # Accepts . before @
Kod
<input type="email" pattern="[A-Za-z0-9._%+-]{3,}@[a-zA-Z]{3,}([.]{1}[a-zA-Z]{2,}|[.]{1}[a-zA-Z]{2,}[.]{1}[a-zA-Z]{2,})" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 11:35:01
Jeśli nie chcesz pisać białej księgi o standardach poczty e-mail, użyj poniższego przykładu, który po prostu wprowadza dobrze znany atrybut CSS(text-transform: małe litery), aby rozwiązać problem:
<input type="email" name="email" id="email" pattern="[a-zA-Z0-9._%+-]+@[a-z0-9.-]+\.[a-zA-Z]{2,4}" style="text-transform: lowercase" placeholder="enter email here ..." title="please enter a valid email" />
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-02 19:15:32
Jeszcze jedno rozwiązanie, które jest zbudowane w oparciu o specyfikację w3org.
Oryginalny regex jest pobierany z w3org .
The last "* Lazy quantifier" w tym regex został zastąpiony przez "+ jeden lub więcej kwantyfikatorów".
Taki wzór jest w pełni zgodny ze specyfikacją, z jednym wyjątkiem: nie zezwala na adresy domen najwyższego poziomu, takie jak " foo @ com "
<input
type="email"
pattern="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+"
title="[email protected]"
placeholder="[email protected]"
required>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 10:52:59
<input type="email" pattern="^[^ ]+@[^ ]+\.[a-z]{2,6}$">
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-18 18:23:52
<input type="email" name="email" id="email" value="" placeholder="Email" required />
Dokumentacja http://www.w3.org/TR/html-markup/input.email.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-03 05:53:22
Aktualizacja 2018 Odpowiedź
Idź tutaj http://emailregex.com/
Javascript:
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-27 08:35:27
Poniższy wzór regex powinien działać z większością wiadomości e-mail, w tym z rosyjskimi.
[^@]+@[^\.]+\..+
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-27 16:38:18
Prostą dobrą odpowiedzią może być wejście takie jak:
input:not(:placeholder-shown):invalid{
background-color:pink;
box-shadow:0 0 0 2px red;
}
/* :not(:placeholder-shown) = when it is empty, do not take as invalid */
/* :not(:-ms-placeholder-shown) use for IE11 */
/* :invalid = it is not followed pattern or maxlength and also if required and not filled */
/* Note: When autocomplete is on, it is possible the browser force CSS to change the input background and font color, so i used box-shadow for second option*/
Type your Email:
<input
type="email"
name="email"
lang="en"
maxlength="254"
value=""
placeholder="[email protected]"
autocapitalize="off" spellcheck="false" autocorrect="off"
autocomplete="on"
required=""
inputmode="email"
pattern="^(?![\.\-_])((?![\-\._][\-\._])[a-z0-9\-\._]){0,63}[a-z0-9]@(?![\-])((?!--)[a-z0-9\-]){0,63}[a-z0-9]\.(|((?![\-])((?!--)[a-z0-9\-]){0,63}[a-z0-9]\.))(|([a-z]{2,14}\.))[a-z]{2,14}$">
Według następującego wzoru:
- zasoby o standardowy format wiadomości e-mail: jakie znaki są dozwolone w adresie e-mail?
- zasoby o standardowe wejście poczty HTML atrybuty :
Https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/inputmode https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email
- Jest to jedna z najbardziej rozpoznawalnych i najbardziej rozpoznawalnych marek w Polsce.]}
- najdłuższa możliwa subdomena (Może =0-64 znak), domena (=0-64 znak), rozszerzenie pierwszego poziomu (=2-14 znak), rozszerzenie drugiego poziomu (Może = 2-14 znaków).
- unikanie nie zwykłych, ale dozwolonych znaków w nazwie E-mail i akceptowanie zwykłych znaków, które słynne darmowe usługi e-mail, takie jak Outlook, Yahoo, Gmail itp. zaakceptuje je. Oznacza akceptację tylko: kropka (.), dash (-), podkreślenie (_) tylko pomiędzy a-z (małe litery) i liczby a także nie akceptując podwójnych obok siebie i maksimum 64 znaki.
Uwaga: w tej chwili, dłuższy adres, a nawet znaki Unicode są możliwe w URL, a także użytkownik może wysyłać wiadomości e-mail do lokalnego lub IP, ale myślę, że nadal lepiej jest nie akceptować nietypowych rzeczy, jeśli strona docelowa jest publiczna.
Wyjaśnij regex:
-
^...$
Od początku do końca -
(?![\.\-_])
nie zaczyna się od tych: . - _ -
((?!--)[a-z0-9\-])
accept a till Z and numbers and-but not -- -
((?![\-\._][\-\._])[a-z0-9\-\._])
od a do z małe litery i cyfry, a także . / align = "left" / -
{0,63}
długość od zera do 63 (druga grupa[a-z0-9]
wypełni +1, ale nie pozwól, aby znak just był. - _) -
@
znak at -
(|(rule))
nie istnieje lub jeśli istnieje, należy postępować zgodnie z zasadą. (Dla subdomeny i rozszerzenia drugiego poziomu) -
\.
kropka
Wyjaśnienie atrybutów:
type="email"
w nowoczesnych przeglądarkach pomaga również prawidłowy email adres
name="email" autocomplete="on"
aby przeglądarka zapamiętała łatwe ostatnio wypełnione wejście do automatycznego uzupełniania
lang="en"
pomoc dla domyślnego wejścia be English
inputmode="email"
pomoże dotykowe klawiatury być bardziej kompatybilne
maxlength="254"
ustawienie maksymalnej długości wejścia
autocapitalize="off" spellcheck="false" autocorrect="off"
wyłączanie możliwych błędnych korektorów automatycznych w przeglądarce
required=""
to pole jest wymagane, jeśli było puste lub nieprawidłowe, formularz nie zostanie przesłany
pattern="..."
regex wewnątrz sprawdzi Walidacja
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 12:51:09
Przetestowałem następujące regex, który daje taki sam wynik jak Chrome HTML walidacji wprowadzania wiadomości e-mail.
[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*
Możesz przetestować go na tej stronie: regex101
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 06:36:24
^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-04 06:00:28
pattern="[a-z0-9._%+-]{1,40}[@]{1}[a-z]{1,10}[.]{1}[a-z]{3}"
<input type="email" class="form-control" id="driver_email" placeholder="Enter Driver Email" name="driver_email" pattern="[a-z0-9._%+-]{1,40}[@]{1}[a-z]{1,10}[.]{1}[a-z]{3}" required="">
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-27 15:07:36