Я использую PHP 5.3.10. Это код:
Он возвращает: «Email: test@example.c правильно.
Я думаю, что домен верхнего уровня с одним символом неверен (я не знаю о TLD с одним символом в соответствии с этим списком: http://data.iana.org/TLD/tlds-alpha-by-domain.txt ).
Итак, фильтр FILTER_VALIDATE_EMAIL работает правильно или нет?
Проверка адресов электронной почты немного сложна. Взгляните на этот список:
Действительные адреса электронной почты
- niceandsimple@example.com
- very.common@example.com
- a.little.lengthy.but.fine@dept.example.com
- disposable.style.email.with+symbol@example.com
- пользователь @ [IPv6: 2001: db8: 1 и след :: A0B: dbd0]
- «much.more необычный» @ example.com
- «very.unusual.@.unusual.com»@example.com
- «very. (),:; <> [] «. ОЧЕНЬ. «очень @ » очень «. необычный» @ strange.example.com
- postbox @ com (домены верхнего уровня являются допустимыми именами хостов)
- admin @ mailserver1 (локальное доменное имя без TLD)
- !#$%&’*+-/=?^_`<>|
.a «@ example.org
Недействительные адреса электронной почты
- Abc.example.com (символ @ должен разделять локальные и доменные части)
- A @ b @ c @ example.com (только один @ разрешен для внешних кавычек)
- a «b (c) d, e: f; gi [j k] l@example.com (ни один из специальных символов в этой локальной части не разрешен для внешних кавычек)
- просто «не» right@example.com (цитируемые строки должны быть разделены точками или единственным элементом, составляющим локальную часть)
- это «не allowed@example.com (пробелы, кавычки и обратные косые черты могут существовать только в том случае, когда в цитированных строках и предшествует обратная косая черта)
- этот still «not allowed@example.com (даже если экранированный (которому предшествует обратная косая черта), пробелы, кавычки и обратные косые черты все равно должны содержаться в кавычках)
Все самые все проверки подлинности электронной почты «прослушиваются», но реализация php отлично подходит для работы, поскольку она принимает все распространенные адреса электронной почты
Относительно «частичных» адресов нет. в части домена комментарий в исходном коде (в ext / filter / logical_filters.c) оправдывает это отклонение, таким образом:
И вот ссылка на класс от Майкла Раштона (ссылка сломана см. Источник ниже), который поддерживает как RFC 5321/5322
Edit 2016: В PHP 7.1 beta я заметил следующее:
- Внедрена проверка подлинности электронной почты в соответствии с RFC 6531. (Лео Фейер, Анатоль).
И некоторые приятные дополнительные примеры
FILTER_VALIDATE_EMAIL не поддерживает PHP 5.2.14
Существует PHP-класс для кода Google для проверки адресов электронной почты:
PHP. Особенности и фичи
Прямой эфир
adogay 9 января 2019, 13:49
pechen 5 декабря 2018, 06:39
clod 2 февраля 2018, 18:28
isudakoff 19 марта 2017, 07:55
pantsarny 23 апреля 2015, 10:40
Adik88 10 марта 2015, 19:43
JudKavel 2 февраля 2015, 23:11
rmrevin 4 декабря 2014, 20:55
Grover 13 октября 2014, 16:48
amor_amore 15 сентября 2014, 13:59
rmrevin 3 сентября 2014, 13:51
Adik88 2 сентября 2014, 13:13
rmrevin 2 сентября 2014, 13:12
rmrevin 16 июня 2014, 19:27
hui_nana 28 мая 2014, 13:33
Grover 26 мая 2014, 11:42
Grover 26 мая 2014, 11:41
hui_nana 23 мая 2014, 10:26
Блоги
- Q&A9.42
- Frontend7.96
- Yii framework7.92
- OS Linux5.66
- CMS 1C-Bitrix5.65
- PHP. Продукты4.63
- PHP. Производительность4.53
- PHP. Особенности и фичи4.53
- Безопасность4.52
- HTML51.25
Очень часто приходится сталкиваться с простейшей задачей — валидацией данных из формы или любых других источников (кукисы, заголовок запроса, etc.) И каждый раз 95% разработчиков городят какие-то неимоверные велосипеды (регулярные выражения, «уникальные» алгоритмы хеширования паролей, etc). И каждый раз мне приходится рассказывать о такой невероятно полезной и нужной функции php — filter_var!
Итак, встречаем, встроенная функция валидации данных.
Эта замечательная функция появилась уже давно, в PHP 5.2.0, но до сих пор, очень малый процент разработчиков применяют её, предпочитая свои велосипеды. И это очень зря, ведь Вы используете готовые фреймворки, ORM и другие инструменты? Так почему Вы не валидируете данные встроенными методами?
Filter_var может проверять и очищать какие угодно данные, от булевых значений, до email и url. Есть 3 типа фильтров:
- Фильтры валидации данных
- Очищающие фильтры
- Остальные фильтры
Так же есть ещё флаги, используемые в фильтрах в качестве третьего параметра функции filter_var. Они нужны для уточнения условий валидности. Сегодня мы рассмотрим фильтры валидации данных подробнее.
Фильтры валидации данных
На момент написания статьи, существовало семь валидирующих фильтров:
- FILTER_VALIDATE_BOOLEAN — проверяет, что значение является корректным булевым значением. Использует неявное приведение типов. Примеры валидных значений: «1», «true», «on», «yes».
- FILTER_VALIDATE_EMAIL — проверяет, что значение является корректным email.
- FILTER_VALIDATE_FLOAT — проверяет, что значение является корректным числом с плавающей точкой.
- FILTER_VALIDATE_INT — проверяет, что значение является корректным целым числом. Дополнительно можно проверить входит ли значение в определенный диапазон.
- FILTER_VALIDATE_IP — проверяет, что значение является корректным ip-адресом (v4 или v6). Дополнительно можно проверить, что IP соответствует протоколу IPv4 или IPv6, а также отсутствие вхождения в частные или зарезервированные диапазоны.
- FILTER_VALIDATE_REGEXP — Проверяет значение на соответствие regexp, Perl-совместимому регулярному выражению.
- FILTER_VALIDATE_URL — проверяет, что значение является корректным url адресом (в соответствии с RFC 2396).
Для некоторых фильтров можно применить параметры или флаги, за подробностями, обратитесь на страницу документации.
Всем здравствуйте!
Помогите, пожалуйста, разобраться с корректной валидацией email.
Есть HTML форма (в примере представлена часть формы для email) :
Понимаю, что надо использовать FILTER_VALIDATE_EMAIL , но куда именно нужно вписать «образец», по которому будет происходить дальнейшее сравнение внесенных в форму данных?
Есть мысль оформить общий подход к валидации email так:
1 вариант:
Если в данное поле формы было что-то введено if(isset($_POST[«email»])), то начинаем осуществлять проверку на корректность вносимых данных, а именно:
использовать if(!filter_var($_POST[’email’], FILTER_VALIDATE_EMAIL)).
Если введенные данные корректны (то есть соответствуют изначально заданному шаблону, например $var = «anyword@domain.ru»;), то продолжаем работу по другим полям формы.
А Если введенные данные некорректны, то отправляем значение в массив ошибок ($errors) и выводим предупреждение об этом ( $errors[’email’] = «Не валидный email»;). А если никакие данные не были введены, то «пустое» значение тоже отправляется в этот же массив ошибок ($errors) , для него установлено уже свое сообщение ($errors[’email’] = «Не заполнено обязательное поле»;).
2 вариант:
Если было отправлено пустое поле email, то присваеваем полученное значение в массив ошибок и выдаем сообщение «Не заполнено обязательное поле» (как это есть в части представленного кода), иначе если поле email было не пустым (какие-то данные все же были введены), то начинаем проверку: Если внесенные данные некорректны (то есть соответствуют изначально заданному шаблону, например $var = «anyword@domain.ru»;), значит полученный результат отправлять в массив ошибок с выдачей сообщения «Не валидный email». Иначе (если полученный результат корректен), то продолжаем двигаться по проверке других форм.
Самый главный вопрос:
в каком месте кода необходимо задать этот шаблон/образец ($var = «anyword@domain.ru),по которому будет происходить сравнение введенной почты на ее корректность; чтобы все работало так как нужно, и чтоб этот образец нигде в браузере не всплывал ?
Заранее благодарю за помощь!
- Вопрос задан более двух лет назад
- 3922 просмотра

Кому интересно — вот решение:
Надо было убрать отрицание перед filter_var($_POST[«email»]. и т.д.
И задавать шаблон/ образец, как было в примере w3school, не надо.
Все работает так, как нужно.