Должен ли sfValidatorEmail не принимать точки в конце локальной части адреса электронной почты? - PullRequest
2 голосов
/ 09 марта 2011

В моем приложении была ошибка, очевидно, точки в конце локальной части адреса электронной почты, где это не считалось ошибкой, а веб-сервис, который я использовал, сообщал мне, что адрес электронной почты был плохо отформатирован.

sfValidatorEmail использует это регулярное выражение:

const REGEX_EMAIL = '/^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i';

Точки в конце локальной части адреса электронной почты действительны в соответствии с symfony 1.4

Есть ли веская причина, по которой sfValidatorEmail не принимает точки в локальной части адреса электронной почты?

Проблема связана с веб-сервисом, которым я пользуюсь?

UPDATE

Просто прочитайте RFC 3696 и вот что он говорит:

Без кавычек локальные части могут состоять любой комбинации буквенного символы, цифры или любой из специальные символы

  ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

точка (".") Также может появляться, но нельзя использовать для начала или окончания
местная часть
, а также два или более появляются последовательные периоды.

1 Ответ

1 голос
/ 27 марта 2011

Достаточно забавно, что оригинальные версии 1.0 Symfony имели более расширяемый валидатор электронной почты. Вы можете прочитать код по адресу http://trac.symfony -project.org / browser / branch / 1.0 / lib / validator / sfEmailValidator.class.php? Rev = 6991

Было два варианта встроенного шаблона регулярных выражений: тот, который вы упомянули выше, а затем Кэл Хендерсон. Я полагаю, что Cal может лучше соответствовать вашим потребностям, и вы можете легко использовать его с Symfony Regex Validator. Я вставил шаблон регулярных выражений и поясняющие комментарии ниже.

/* Cal Henderson: http://iamcal.com/publish/articles/php/parsing_email/pdf/
 * The long regular expression below is made by the following code
 * fragment:
 *
 *   $qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]';
 *   $dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]';
 *   $atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c'
 *         . '\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+';
 *   $quoted_pair = '\\x5c\\x00-\\x7f';
 *   $domain_literal = "\\x5b($dtext|$quoted_pair)*\\x5d";
 *   $quoted_string = "\\x22($qtext|$quoted_pair)*\\x22";
 *   $domain_ref = $atom;
 *   $sub_domain = "($domain_ref|$domain_literal)";
 *   $word = "($atom|$quoted_string)";
 *   $domain = "$sub_domain(\\x2e$sub_domain)*";
 *   $local_part = "$word(\\x2e$word)*";
 *   $addr_spec = "$local_part\\x40$domain";
 */

$re = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-'
     .'\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-'
     .'\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-'
     .'\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80'
     .'-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29'
     .'\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^'
     .'\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-'
     .'\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-'
     .'\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*'
     .'\\x5d))*$/'
;

Я думаю, что также важно помнить, что есть редкие случаи, когда адрес электронной почты может не соответствовать RFC, например адреса электронной почты локальной интрасети. Просто мысль.

...