Серию валидаторов пополняю функцией проверки введенного email на соответствие формальным требованиям.
По стандарту RFC822
Если есть необходимость соблюсти все требования, которые упомянуты в громоздкой спецификации RFC822, то лучший путь — воспользоваться функцией библиотеки IMAP для PHP:
1 |
imap_rfc822_parse_adrlist(string $address, string $default_host); |
Вообще-то функция может проверять сразу несколько адресов (записанных в одной строке). И мне не ясна роль параметра $default_host, от которого результат функции не зависит. В итоге, для одного адреса получается вот такой валидатор:
1 2 3 4 5 6 7 |
function is_rfc822_valid_email($address_string) { $address_array = imap_rfc822_parse_adrlist($address_string, ''); if (!is_array($address_array) || count($address_array) != 1) { return false; } return true; } |
Модуль imap подключается соответствующими манипуляциями в файле php.ini, если он не подключен.
Проверка email в WordPress и Drupal
Так как стандарт RFC, мягко говоря, мало кто соблюдает в силу его «перегруженности», то во многих CMS реализованы свои «облегченные» функции проверки адреса электронной почты.
В WP реализована функция, которая проверяет email и возвращает либо false — если адрес не прошел проверку, либо «подчищенный» валидный email.
1 2 |
//функция проверки почты в Wordpress function is_email( $email ); |
Drupal тоже предлагает свою функцию для проверки, она возвращает булевое значение соответствующее результату проверки.
1 2 |
//функция проверки почты в Drupal 7 function valid_email_address( $email ); |
Исходный код функций вы можете изучить самостоятельно.
Пример проверки адреса электронной почты на PHP
Раз уж такие именитые CMS не брезгуют отступать от стандартов, то не вижу причин почему бы не использовать собственную функцию для проверки. Иногда я пользуюсь довольно мощной функцией из Drupal 6, алгоритм которой следует предписаниям стандарта RFC 2822.
1 2 3 4 5 6 7 8 |
function valid_email_address( $mail ) { $user = '[a-zA-Z0-9_\-\.\+\^!#\$%&*+\/\=\?`\|\{\}~\']+'; $domain = '(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.?)+'; $ipv4 = '[0-9]{1,3}(\.[0-9]{1,3}){3}'; $ipv6 = '[0-9a-fA-F]{1,4}(\:[0-9a-fA-F]{1,4}){7}'; return preg_match("/^$user@($domain|(\[($ipv4|$ipv6)\]))$/", $mail); } |
Она удобна тем, что шаблоны для разных частей формата объявляются отдельно. Валидацию пройдут адреса не только с буквенными именами почтового домена, но и почтовым сервером, представленным в виде ip адреса.
Регулярка гарантирует, что этот адрес не эксплуатирует какие-то уязвимости вашего способа слать письма.