Как проверить ввод формы с помощью проверки ввода HTML5
я попытался найти полный список шаблонов для проверки ввода с помощью проверки формы HTML5 для различных типов, в частности url
, email
, tel
и такие, но я не мог найти любой. В настоящее время встроенные версии этих входных проверок далеки от совершенства (и tel
даже не проверяет, является ли вещь, которую вы вводите, номером телефона). Поэтому мне было интересно, какие шаблоны я могу использовать для проверки того, что пользователь вводит правильный формат в входы?
вот несколько примеров случаев, когда проверка по умолчанию позволяет вводить данные, которые не должны быть разрешены:
type="email"
это поле разрешает электронные письма с неправильными доменами После@, а также позволяет адресам начинаться или заканчиваться тире или периодом, что также запрещено. Итак,.example-@x
разрешено.
type="url"
этот вход в основном позволяет любой вход, который начинается с http://
(Chrome) и затем следует что-либо, кроме нескольких специальных символов, таких как те, которые имеют функцию в URL-адресах ( ,@,#, ~ и т. д.). В FF все, что проверено, - это если оно начинается с http:
, а затем все, кроме :
(даже просто http:
разрешено в FF). IE делает то же самое, что и FF, за исключением того, что он не запрещает http::
.
например: http://.
разрешена во всех трех. И так же http://,
.
type="tel"
в настоящее время нет встроенный проверка номеров телефонов в любом из основных браузеров (он функционирует на 100% так же, как type="text"
, кроме указания мобильных браузеров, какую клавиатуру отображать.
Итак, поскольку браузеры не показывают последовательного поведения в каждом из этих случаев, и поскольку поведение, которое они показывают, очень простое со многими ложными срабатываниями, что я могу сделать, чтобы проверить мои HTML-формы (все еще используя проверку ввода HTML5)?
PS: я публикую это потому что мне было бы полезно иметь полный список шаблонов проверки формы, поэтому я решил, что это может быть полезно и для других (и, конечно, другие могут публиковать свои решения).
1 ответов
эти шаблоны не обязательно просты, но вот что я думаю, работает лучше всего в каждой ситуации. Имейте в виду, что (совсем недавно) Интернационализированные Доменные Имена (IDNs) доступно слишком. При этом в URL-адресах разрешено непроверяемое количество символов (все еще существует множество символов, которые не разрешены в доменных именах, но список разрешенных символов настолько велик и будет меняться так часто для разных доменов верхнего уровня, что это не так практично идти в ногу с ними). Если вы хотите поддерживать интернационализированные доменные имена, следует использовать второй шаблон URL, в противном случае используйте первый.
TL; DR:
вот демо чтобы увидеть следующие шаблоны в действии. Прокрутите вниз для объяснения, рассуждения и анализа этих узоры.
URLs
https?:\/\/(?![^\/]{253}[^\/])((?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}|((1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5])))(\/.*)?
https?:\/\/(?!.{253}.+$)((?!-.*|.*-\.)([^ !-,\.\/:-@\[-`{-~]{1,63}\.)+([^ !-\/:-@\[-`{-~]{2,15}|xn--[a-zA-Z0-9]{4,30})|(([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9])\.){3}([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9]))(\/.*)?
письма
(?!(^[.-].*|[^@]*[.-]@|.*\.{2,}.*)|^.{254}.)([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@)(?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}
номера телефонов
((\+|00)?[1-9]{2}|0)[1-9]( ?[0-9]){8}
((\+|00)?[1-9]{2}|0)[1-9]([0-9]){8}
имена в западном стиле
([A-ZΆ-ΫÀ-ÖØ-Þ][A-ZΆ-ΫÀ-ÖØ-Þa-zά-ώß-öø-ÿ]{1,19} ?){1,10}
URLs, без поддержки IDN
https?:\/\/(?![^\/]{253}[^\/])((?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}|((1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}(1[0-9]{2}|[1-9]?[0-9]|2([0-4][0-9]|5[0-5])))(\/.*)?
объяснение:
- DNSes
- URL-адреса всегда должны начинаться с http: / / или https://, так как нам не нужны ссылки на другие протоколы.
- доменные имена не должны начинаться или заканчиваться
-
- доменные имена могут быть не более 63 символов каждый (таким образом, не более 63 символов между каждой точкой), и общая длина (включая точки) не может превышать 253 (или 255? будьте осторожны и ставьте на 253.) персонажи [1].
- не-IDNs может поддерживать только буквы латинского алфавита, цифры от 0 до 9 и a тире.
- домены верхнего уровня не-IDNs содержат только буквы латинского алфавита [2].
- я установил произвольное ограничение в 15 букв, так как в настоящее время нет доменов, превышающих 13 символов ("
.international
"), которые, скорее всего, не изменится в ближайшее время.
- IPs
- особые случаи, такие как
0.0.0.0
,127.0.0.1
, etc. не проверяются на - IPs, которые имеют дополненные нули в них не допускаются (например
01.1.1.1
) [4]. - IP-номера могут идти только от 0 до 255. 256 не допускается.
- особые случаи, такие как
обратите внимание, что по умолчанию http:.*
шаблон, встроенный в современные браузеры, всегда будет применяться, поэтому даже если вы удалите https?://
в начале этого шаблона он по-прежнему будет применяться. Использовать type="text"
чтобы избежать этого.
URLs, с IDN поддержка
https?:\/\/(?!.{253}.+$)((?!-.*|.*-\.)([^ !-,\.\/:-@\[-`{-~]{1,63}\.)+([^ !-\/:-@\[-`{-~]{2,15}|xn--[a-zA-Z0-9]{4,30})|(([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9])\.){3}([01]?[0-9]{2}|2([0-4][0-9]|5[0-5])|[0-9]))(\/.*)?
объяснение:
поскольку в IDNs разрешено огромное количество символов, практически невозможно перечислить все возможные комбинации в атрибуте HTML (вы получите огромный шаблон, поэтому в этом случае гораздо лучше проверить его каким-либо другим методом, чем регулярное выражение) [5].
- запрещенные символы в доменных именах являются:
!"#$%&'()*+, ./ :;<=>?@ [\]^_`` {|}~
С исключение периода в качестве разделителя домена.- они соответствуют в диапазонах
[!-,]
[\.\/]
[:-@]
[\[-``]
[{-~]
.
- они соответствуют в диапазонах
- все остальные символы разрешены в этом поле ввода
- TLDs разрешено иметь те же буквы в них, до произвольного предела 15 символов (например, с URL-адресами без IDN).
- кроме того, дву могут иметь формат
xn--*
С*
будучи закодированным фактический TLD. Эта кодировка использует 2 латинские буквы или арабские цифры на исходный символ, поэтому произвольный предел здесь удваивается до 30.
адрес электронной почты
(?!(^[.-].*|[^@]*[.-]@|.*\.{2,}.*)|^.{254}.)([a-zA-Z0-9!#$%&'*+\/=?^_`{|}~.-]+@)(?!-.*|.*-\.)([a-zA-Z0-9-]{1,63}\.)+[a-zA-Z]{2,15}
объяснение:
поскольку адреса электронной почты требуют намного больше, чем этот шаблон, чтобы быть 100% надежным, это будет охватывать почти полные 100% из них. 100% полный шаблон существует, но содержит PCRE (PHP) - только lookaheads регулярных выражений, поэтому он не будет работать в HTML-формах.
- адреса электронной почты может содержать только буквы латинского алфавита, цифры 0-9, и символы
!#$%&'*+\/=?^_``{|}~.-
[6]. - акценты не поддерживаются повсеместно [7], а если необходимо, напишите комментарий, и я мог бы написать версию, которая соответствует RFC 6530 стандартные.
- локальная часть (до
@
только длина 63 символа, а общий адрес может быть только 254 символа [8]. - адреса не могут начинаться или заканчиваться на
-
или.
, и никакие две точки не могут появиться последовательно [8]. - домен не может быть IP-адресом [9].
- кроме этого, я включил только не-IDN часть шаблона. IDNs тоже разрешены, поэтому они приведут к false отрицания.
номера телефонов
((\+|00)?[1-9]{2}|0)[1-9]( ?[0-9]){8}
((\+|00)?[1-9]{2}|0)[1-9]([0-9]){8}
объяснение:
- номера телефонов должны начинаться с одного из следующих, где
[CTRY]
стоит код страны, а X означает первую ненулевую цифру (например,6
в мобильные числа),00[CTRY]X
+[CTRY]X
0X
-
[CTRY]X
(это официально не правильный синтаксис, но Chrome Autofill, похоже, нравится по какой-то причине.)
- пробелы разрешены между цифрами (см. Второй шаблон для версии без пробелов), за исключением ненулевого X, как определено выше.
- номера телефонов должны быть ровно 9 цифр длиной, кроме части перед первым ненулевой X, как определено выше.
это регулярное выражение предназначено только для 10-значных телефонных номеров. Поскольку длина телефонного номера может варьироваться между странами, лучше использовать менее строгую версию этой модели или модифицировать ее для работы в нужных странах. Итак, этот шаблон следует использовать как некий шаблон.
Extra: имена в западном стиле
([A-ZΆ-ΫÀ-ÖØ-Þ][A-ZΆ-ΫÀ-ÖØ-Þa-zά-ώß-öø-ÿ]{1,19} ?){1,10}
Да, я знаю, я очень Западно-ориентированный, но это может быть полезно тоже, так как это может быть трудно сделать тоже, и в случае, если вы делаете сайт для западных людей тоже, это всегда будет работать (азиатские имена имеют представление именно в этом формате тоже).
- все имена должны начинаться с заглавной буквы
- заглавные буквы могут встречаться в середине имен (например, John McDoe)
- имена должны быть не менее 2 букв
- я установил произвольный максимум 10 имен (эти люди, вероятно, не будет возражать), каждая из которых может быть не более 20 букв (длина "Werbenjagermanjensen", который оказывается № 1).
- допускаются латинские и греческие буквы, включая все акцентированные латинские и греческие буквы (список) и исландские буквы (
ÐÞ ðþ
):-
A-Z
соответствует всем прописным латинским буквам:ABCDEFGHIJKLMNOPQRSTUVWXYZ
-
Ά-Ϋ
соответствует всем заглавным греческим буквам, включая акцентированные:Ά·ΈΉΊΌΎΏΐ ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ ΪΫ
. -
À-ÖØ-Þ
соответствует всем латинским буквам с ударением в верхнем регистре, а Ð и Þ:ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ
. Между ними также есть персонаж×
(междуÖ
иØ
), который оставлен таким образом. -
a-z
соответствует всем строчным латинским буквам:abcdefghijklmnopqrstuvwxyz
-
ά-ώ
соответствует всем строчным греческим буквам, включая акцентированные:άέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ
-
ß-öø-ÿ
соответствует всем строчным латинским буквам с ударением и ß, ð и þ:ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
. Между ними также есть персонаж÷
(междуö
иø
), который оставлен таким образом.
-
ссылки
- https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_syntax→ https://tools.ietf.org/html/rfc1034#section-3.1
- https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains / https://www.icann.org/resources/pages/tlds-2012-02-25-en
- https://en.wikipedia.org/wiki/Domain_name#Technical_requirements_and_process / каковы разрешенные символы в поддомене
- основываясь на том, что ни браузеры, ни Строка cmd Windows позволяет использовать расширенный формат.
- каковы разрешенные символы в поддомене → http://www.domainnameshop.com/faq.cgi?id=8&session=106ee5e67d523298
- https://en.wikipedia.org/wiki/Email_address#Local_part / какие символы разрешены в электронном письме адрес?
- https://en.wikipedia.org/wiki/Email_address#Internationalization
- https://en.wikipedia.org/wiki/Email_address#Syntax→ http://tools.ietf.org/html/rfc5321#section-4.5.3.1
- отправка электронной почты с использованием IP-адреса вместо доменного имени