MySQL регулярное выражение для проверки электронной почты не работает - квантификатор фигурных скобок игнорируется - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь использовать следующее регулярное выражение для проверки писем в базе данных MySQL:

^[^@]+@[^@]+\.[^@]{2,}$

в таком состоянии:

...and email REGEXP '^[^@]+@[^@]+\.[^@]{2,}$'

По большей части, выражение работает.Но это позволяет использовать односимвольные домены верхнего уровня.Например, оба следующие письма проходят проверку:

something@hotmail.com и something@hotmail.c

Второй случай явно опечатка.{2,} регулярного выражения должно позволять любую строку символов, кроме символа @, длиной 2 или более, после точки.

Я сам запускал регулярное выражение через несколько тестеров, использующих разные протоколы (Perl, TCL и т. Д.), И каждый раз он работает как положено, отклоняя односимвольную версию TLD адреса электронной почты.Только когда я использую это регулярное выражение в контексте MySQL, оно завершается неудачей.

Я проверил, и после «.c» в ошибочном адресе электронной почты нет никаких дополнительных символов.Есть ли что-то, что присуще MySQL или этой версии, что могло бы помешать этому?

Запуск MySQL версии 5.5.61-cll

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Боже, мы хакеры и проверяем вещи! Более того, мы понимаем такие понятия, как соответствие ACID, целостность данных и отдельные точки авторитета. Очевидно, что мы должны убедиться, что недействительные электронные письма не попадают в БД. Что еще? У нас есть такой замечательный инструмент для этого: правильная схема с проверочными ограничениями!

К сожалению, электронные письма являются одной из тех деталей, которые общеизвестно трудно проверить с помощью простых регулярных выражений. Это - это возможно , обязательно . Нет, на самом деле это не так. Ни одна из этих ссылок не обеспечивает 100% соответствия.

Гораздо лучший подход - просто проверить адрес, отправив ему электронное письмо с кодом активации. Дэвид Гилбертсон объясняет это намного лучше , чем я собираюсь в кратком SO ответе, но основные моменты:

  1. Даже не пытайтесь проверить.

  2. Просто проверить адрес с реальным адресом электронной почты.

Для моих проектов, как личных, так и профессиональных, это регулярное выражение, которое я использую для проверки работоспособности адреса электронной почты перед отправкой письма активации / подтверждения:

\S+@\S+ 

Это чрезвычайно просто (да, все еще исключает некоторые технически действительные адреса электронной почты), чрезвычайно просто отлаживать и работает для любого законного трафика на наши сайты. (Я еще не видел адрес электронной почты, даже близкий к чему-то вроде #!$%&’*+-/=?^_{}|~@example.com в наших журналах.)

0 голосов
/ 18 января 2019

Вы можете попробовать использовать следующий шаблон регулярных выражений:

^[^@]+@[^.]+[.][^.]{2,}([.][^.]{2,})*$

Самая правая часть шаблона означает:

[.]                match a literal dot
[^.]{2,}           followed by a domain component (any 2 or more characters but dot)
([.][^.]{2,})*     followed by dot and another component, zero or more times

Демо

Так что это будет соответствовать:

jon.skeet@google.com
jon.skeet@google.co.uk

Но не будет соответствовать:

gordonlinoff@blah
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...