#regex #html #forms #validation
#регулярное выражение #HTML #формы #проверка
Вопрос:
Я пытаюсь написать шаблон HTML5, чтобы запретить пользователям вводить бесплатные учетные записи электронной почты. Пока у меня есть это…
<input name="email"
placeholder="Work Email"
required
type="email"
title="Enter a valid work email address (No free email services)"
pattern="^((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!mail)(?!yandex)(?!hushmail)(?!lycox)(?!lycosmail)(?!inbox)(?!myway)(?!aim)(?!fastmail)(?!goowy)(?!juno)(?!shortmail)(?!atmail)(?!protonmail).)*$"/>
Он близок, но в нем отсутствуют два ключевых правила…
- Следует смотреть только на то, что находится между «@» и «.’
- Должно быть нечувствительным к регистру.
Есть идеи о том, как заставить это работать?
ОБНОВЛЕНИЕ Чтобы избежать бесполезных комментариев о том, должен ли я это делать, рассмотрите другие варианты использования, в которых поле ввода не должно содержать список известных ключевых слов. Аналогичным вариантом использования могут быть нецензурные слова или префикс идентификатора, где существует несколько префиксов, но вы хотите избежать ввода только одного типа… Идентификатор никогда не должен содержать IXT и ввод пользователя… WIN-09880, IXT-2342, NTS-23422.
Комментарии:
1. Да, прочитайте больше о прогнозах и проведите тесты, чтобы хорошо понять, что это такое и как они работают. Обратите внимание, что вы можете использовать чередование внутри них. Поиск по встроенным модификаторам. Опишите все от начала до «@».
2. Кроме того, запрещать пользователям вводить бесплатный адрес электронной почты — очень странная идея.
3. Эта часть адреса не должна учитывать регистр, домены электронной почты не чувствительны к регистру, и если регистр ввода важен, вы можете выполнить преобразование строки в нижний регистр после получения данных из формы.
4. Что, если они работают в Facebook или работают в Microsoft? Или работать в Yahoo? Вы отказываете им в использовании их рабочей электронной почты, когда это именно то, что вы запрашиваете.
5. @Martin Я использую атрибут шаблона HTML5, чтобы запретить пользователю вводить бесплатные учетные записи электронной почты в поле формы. Поэтому преобразование в нижний регистр должно произойти до того, как пользователь отправит форму для использования проверки HTML5. Полагаю, я мог бы применить его к размытию.
Ответ №1:
Это действительно плохая идея, но в духе ответа на ваш вопрос, вот мой ответ.
Вы можете использовать:
pattern="^. @((?!hotmail)(?!gmail)(?!ymail)(?!googlemail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!mail)(?!yandex)(?!hushmail)(?!lycox)(?!lycosmail)(?!inbox)(?!myway)(?!aim)(?!fastmail)(?!goowy)(?!juno)(?!shortmail)(?!atmail)(?!protonmail).) .. $"
чтобы искать только между символами «@» и «.». HTML5 не поддерживает флаг i для нечувствительности к регистру, поэтому вам нужно будет либо использовать JavaScript, либо жестко прописать нечувствительность к регистру в шаблоне.
Комментарии:
1. Вы можете сделать немного короче:
^. @(?:(?!(g|hot|y|google|hush|fast|at|short|at|proton)?mail)(?!live)(?!gmx)(?!yahoo)(?!outlook)(?!msn)(?!icloud)(?!facebook)(?!aol)(?!zoho)(?!yandex)(?!lycox)(?!inbox)(?!myway)(?!aim)(?!goowy)(?!juno).) .. $
Ответ №2:
Вы не можете:
-
Я нашел неполный список бесплатных поставщиков электронной почты, который содержит 2840 записей.
-
Вы заблокируете пользователей, которые работают в Microsoft, Google, Facebook, Yahoo, ProtonMail, Free, Orange, Sfr и многих других.
-
Что вы будете делать с пользователями, у которых есть их доменное имя?
Комментарии:
1. Хотя это не технический ответ на заданный вопрос, я полностью согласен (как указано в комментариях выше) с аргументами в пользу достигнутого вывода. Так досадно, что я хочу -1 за то, что это не ответ на решение кода, но 1 для логических рассуждений ….. 1 выигрывает, просто….
2. @Martin я не уверен, что хорошим ответом должен быть кодовый ответ. Вопрос в том, «Есть какие- либо идеи о том, как заставить это работать? » и я думаю, что мой ответ подходит. В любом случае спасибо 🙂
3. Я бы подумал, что в хорошем ответе будут отмечены проблемы (как у вас), но укажите регулярное выражение, которое позволит решить проблему. Основная проблема заключается в обнаружении подстрок во входных данных, а не в том, почему плакат хочет это сделать
:-)
Ответ №3:
Вот исправленная (и сокращенная) версия вашего регулярного выражения, предназначенная только для доменной части адреса:
^(?!.*@(?:hotmail|gmail|ymail|googlemail|live|gmx|yahoo|outlook|msn|icloud|facebook|aol|zoho|mail|yandex|hushmail|lycox|lycosmail|inbox|myway|aim|fastmail|goowy|juno|shortmail|atmail|protonmail).w $).*$
Вы можете сократить его еще больше, если вам нужно:
^(?!.*@(?:live|gmx|yahoo|outlook|msn|icloud|facebook|aol|zoho|yandex|lycox|inbox|myway|aim|goowy|juno|(?:hot|[gy]|google|short|at|proton|hush|lycos|fast)?mail).w $).*$
Вы не можете сделать его нечувствительным к регистру, потому что JavaScript regex, что очень досадно, не поддерживает встроенные модификаторы. Но обязательно ли для этого использовать регулярное выражение? Я бы предпочел кодовое решение, использующее обновляемый список запрещенных доменов.