1. PHP / Говнокод #13563

    +150

    1. 1
    2. 2
    3. 3
    4. 4
    if (preg_match(
            '@^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+\@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$@',
            $email
        )

    валидация email-а

    Запостил: shmaltorhbooks, 07 Августа 2013

    Комментарии (8) RSS

    • Валидация e-mail'а чуть более, чем во всех случаях, пустое занятие. Для проверки нужно убедиться в наличии MX-записи для домена, а затем отправить письмо на этот адрес. Все остальные способы ненадёжны.

      Итак, в чём здесь говно:
      1. Домены первого уровня не поддерживаются, хотя теоретически они могут содержать MX-запись и принимать письма. Почему-то эту возможность упускают едва ли не все валидаторы.
      2. Этот валидатор пропустит мусор, которого в доменных именах быть не должно (!#$%'*+\=?^_`{|}~), но не пропустит нелатинские буквы (типа президент.рф). По RFC1034 кроме букв, цифр и знака «минус» в доменах ничего быть не должно (нелатинские буквы допускаются, потому что могут быть закодированы через Punycode).

      Тем не менее, не совсем говно:
      1. Нет дурацкого ограничения на длину частей, которым грешат многие валидаторы.
      2. Нет дурацкого ограничения на формат локальной части (которая перед собакой), ибо RFC2822 допускает для каждого почтового сервера собственный формат имён пользователей.
      Ответить
    • Неужели так сложно запомнить эту регулярку http://ex-parrot.com/~pdw/Mail-RFC822-Address.html
      Ответить
      • >запомнить
        I lol'd.
        Ответить
      • Неужели так сложно запомнить filter_var($email, FILTER_VALIDATE_EMAIL)
        Впрочем, мне тоже частенько приходится писать "своё" потому как заказчик не хочет слышать про RFC и говорит что не бывает восклицательных знаков в адресе. :)
        И всё-таки мне интересно откуда родились ограничения на спец-символы и цифры в качестве первого символа на популярных мыльниках.
        Ответить
        • FILTER_VALIDATE_EMAIL проигрывает в фалометрическом соревновании 1148 символов регулярки против 6424.
          Ответить
          • Еще проще. FILTER_VALIDATE_EMAIL не пропустит мыло вида name@local а должно :)
            Ответить
        • Восклицательные знаки (и не только они, но и другие знаки препинания) в адресах (local-part) были популярны, когда кроме Интернета было много других сетей (UUCP, Compuserve, Bitnet, многочисленные FTN) и при кросспостинге в другие сети приходилось городить длинные адреса с хитрыми разделителями.

          А ограничения на спецсимволы родились оттого, что у некоторых сервисов логин одновременно используется в URL домашней странички владельца. Примеры:
          [email protected] -> http://my.mail.ru/list/vasya/
          [email protected] -> http://vasya.ya.ru/
          В первом примере в имени нежелательно использовать символы, которые в URL нужно экранировать (слэш, знак вопроса, амперсанд, двоеточие), а во втором случае нежелательно использовать символы, недопустимые в доменном имени (и точку тоже, чтобы не создавать домены высоких порядков).
          Ответить
    • Эта штука пропускает e-mail с точкой на конце, который не является правильным ни в RFC 822, ни в RFC 2822.
      Один раз я случайно отправил на такой адрес, и получил отказ от сервера. Потом долго выкуривал из автодополнения Thunderbird, которое не давало ввести правильный адрес, настойчиво дописывая точку.

      Пруф (RFC 2822):

      mailbox = name-addr / addr-spec
      addr-spec = local-part "@" domain
      domain = dot-atom / domain-literal / obs-domain
      obs-domain = atom *("." atom)
      atom = [CFWS] 1*atext [CFWS]
      domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
      dot-atom = [CFWS] dot-atom-text [CFWS]
      dot-atom-text = 1*atext *("." 1*atext)
      atext = ALPHA / DIGIT / ; Any character except controls,
      "!" / "#" / ; SP, and specials.
      "$" / "%" / ; Used for atoms
      "&" / "'" /
      "*" / "+" /
      "-" / "/" /
      "=" / "?" /
      "^" / "_" /
      "`" / "{" /
      "|" / "}" /
      "~"
      Ответить

    Добавить комментарий