Как добавить в проверку email конкретные tld?
Есть регулярное выражение, которое проверяет email:
email: (value) => {
const pattern = /^(([^<>()[\]\\.,;:\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,}))$/;
return pattern.test(value) || "Invalid e-mail.";
},
Что необходимо добавить в него/ изменить в нем, чтобы доступные вводимые имейлы могли заканчиваться только на 2 возможных tld: com или ukr?
Ответы (1 шт):
Что нужно знать в таких случаях, так это где нужно ввести изменение. Для этого нужно понять, как работает регулярное выражение, выявить его составные компоненты и ограничить ту часть, которая нужна.
На сайте regex101.com в режиме PCRE можно включить опцию extended (флаг x) и разбить регулярное выражение по строкам, вот что у меня получилось:
^
(
[^<>()[\]\\.,;:\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,}
)
$
См. пример на regex101. Да, я удалил ненужные скобки, где они ничего не группировали.
Сразу становится ясно, что [^<>()[\]\\.,;:\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,}, чередование двух шаблонов.
\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}] находит IP в квадратных скобках, и это снова не наш шаблон. Зато ([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,} - то, что нужно.
Замените [a-zA-Z]{2,} на (?:ukr|com), и дело с концом:
^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@(\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}]|([a-zA-Z\-0-9]+\.)+(?:com|ukr))$