Регулярное выражение не очень подходит для определения правильности синтаксиса адреса электронной почты, а опция FILTER_VALIDATE_EMAIL
для функции filter_var
также довольно ненадежна Я использую EmailAddressValidator Class для проверки синтаксиса адреса электронной почты.
Я собрал несколько примеров неверных результатов, возвращаемых filter_var
(версия PHP 5.3.2-1ubuntu4.2). Есть, вероятно, больше. Некоторые, правда, немного экстремальны, но все же стоит отметить:
RFC 1035 2.3.1. Предпочтительный синтаксис имени
http://tools.ietf.org/search/rfc1035
Суммируется как: домен состоит из меток, разделенных точечными разделителями (хотя это не обязательно верно для локальных доменов).
echo filter_var('name@example', FILTER_VALIDATE_EMAIL);
// name@example
RFC 1035 2.3.1. Предпочтительный синтаксис имени
Метки должны соответствовать правилам для имен хостов ARPANET. Они должны начинаться с буквы и с буквы или цифры и содержать в качестве внутренних символов только буквы, цифры и дефис.
echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
// name@1example
RFC 2822 3.2.5. Строки в кавычках
http://tools.ietf.org/html/rfc2822#section-3.2.5
Это действительно (хотя это отклонено многими почтовыми серверами):
echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL);
// FALSE
RFC 5321 4.5.3.1.1. Локальная часть
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1
Максимальная общая длина имени пользователя или другой локальной части составляет 64 октета.
Тест с 70 символами:
echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
// AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
RFC 5321 4.5.3.1.2. Домен
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2
Максимальная общая длина доменного имени или номера составляет 255 октетов.
Тест с 260 символами:
echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
// name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
Посмотрите Подтвердите адрес электронной почты с помощью PHP, правильный путь для получения дополнительной информации.