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

    +162

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    function checkmail($mail) 
        {
            $mail = trim($mail);
            if ((strlen($mail) == 0) OR (!preg_match('/^[a-z0-9_-]{1,20}+(\.){0,2}+([a-z0-9_-]){0,5}@(([a-z0-9-]+\.)+(com|net|org|mil|edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/is', $mail))) {
                return false;
            } 
            return true;
        }

    валидация e-mail

    Запостил: rtfm, 03 Ноября 2010

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

    • А если у меня в другой зоне почта, и даже не в состоящей из двух букв латинского алфавита? OH_SHI~
      Ответить
      • http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
        Ответить
        • Регулярка по вашей ссылке проверяет ещё и кавычки
          то есть такие адреса:
          "user name" <[email protected]>, <[email protected]>, [email protected]

          Если же надо только адрес, без всяких кавычек, то регулярка, гораздо проще.

          /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z
          0-9])$/i
          Ответить
          • Ваша регулярка скушает "[email protected]" и не скушает root@localhost.
            так что не канает))
            Ответить
            • Ваша регулярка тоже пропускает "[email protected]". Нежданчик?!

              а насчёт root@localhost согласен, обязательно нужно пропускать, обязательно.
              Ответить
              • последняя фраза - ирония.
                Ответить
                • интернет-погромисту совершенно не обязательно знать как работает DNS (суффиксы), lul
                  Ответить
                  • это к чёму?
                    Ответить
                    • http://rob.nu/wp-content/ uploads/2009/09/facepalm2.jpg

                      тройной пусть останется в запасе, на случай дальнейших откровений о "правильных" адресах
                      Ответить
                      • Если так надо localhost или просто домен без точки,
                        модифицируй регулярку.
                        Ответить
                        • не вижу смысла скруглять колёса новоизобретенному велосипеду
                          Ответить
                      • Смотри мои два коммента ниже.
                        http://govnokod.ru/4526#comment51196
                        Ответить
                • в чем ирония? мыло без точки в домене совершенно валидно.
                  Ответить
                  • Если так надо localhost или просто домен без точки,
                    модифицируй регулярку.
                    Ответить
                    • не вижу смысла скруглять колёса новоизобретенному велосипеду
                      Ответить
                  • Смотри мои два коммента ниже.
                    http://govnokod.ru/4526#comment51196
                    Ответить
    • Теперь спокойно, друзья.
      Я скачал пакет по ссылке http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

      Достал оттуда метод, формирующий эту страшную регулярку для проверки мыла

      sub make_rfc822re {
      #   Basic lexical tokens are specials, domain_literal, quoted_string, atom, and
      #   comment.  We must allow for lwsp (or comments) after each of these.
      #   This regexp will only work on addresses which have had comments stripped 
      #   and replaced with lwsp.
      
          my $specials = '()<>@,;:\\\\".\\[\\]';
          my $controls = '\\000-\\037\\177';
      
          my $dtext = "[^\\[\\]\\r\\\\]";
          my $domain_literal = "\\[(?:$dtext|\\\\.)*\\]$lwsp*";
      
          my $quoted_string = "\"(?:[^\\\"\\r\\\\]|\\\\.|$lwsp)*\"$lwsp*";
      
      #   Use zero-width assertion to spot the limit of an atom.  A simple 
      #   $lwsp* causes the regexp engine to hang occasionally.
          my $atom = "[^$specials $controls]+(?:$lwsp+|\\Z|(?=[\\[\"$specials]))";
          my $word = "(?:$atom|$quoted_string)";
          my $localpart = "$word(?:\\.$lwsp*$word)*";
      
          my $sub_domain = "(?:$atom|$domain_literal)";
          my $domain = "$sub_domain(?:\\.$lwsp*$sub_domain)*";
      
          my $addr_spec = "$localpart\@$lwsp*$domain";
      
          my $phrase = "$word*";
          my $route = "(?:\@$domain(?:,\@$lwsp*$domain)*:$lwsp*)";
          my $route_addr = "\\<$lwsp*$route?$addr_spec\\>$lwsp*";
          my $mailbox = "(?:$addr_spec|$phrase$route_addr)";
      
          my $group = "$phrase:$lwsp*(?:$mailbox(?:,\\s*$mailbox)*)?;\\s*";
          my $address = "(?:$mailbox|$group)";
      
          return "$lwsp*$address";
      }
      Ответить
    • Я вытащил оттуда строку

      my $addr_spec = "$localpart\@$lwsp*$domain";

      Она содержит регулярку для проверки только самого адреса.
      Я вывел её, вот она.

      (?:[^()<>@,;:\\".\[\] \000-\037\177]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\037\177]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\037\177]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[(?:[^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\037\177]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[(?:[^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*

      регулярка матчит и root@localhost
      Ответить
      • Вобщем-то круто! Только я так и не уразумел зачем, кроме академического интереса. Если адрес соответствует RFC-822 то и везде будет проходить без проблем.
        Ответить
        • по RFC822 проходят такие адреса:

          "127.0.0.1"@[127.0.0.1]
          Abigail <[email protected]>
          Abigail<[email protected]>
          Abigail<@a,@b,@c:[email protected]>
          "This is a phrase"<[email protected]>
          "Abigail "<[email protected]>
          "Joe & J. Harvey" <example @Org>
          Abigail <abigail @ example.com>
          Abigail made this < abigail @ example . com >
          Abigail(the bitch)@example.com
          Abigail <abigail @ example . (bar) com >
          Abigail < (one) abigail (two) @(three)example . (bar) com (quz) >
          Abigail (foo) (((baz)(nested) (comment)) ! ) < (one) abigail (two) @(three)example . (bar) com (quz) >
          Abigail <abigail(fo\(o)@example.com>
          Abigail <abigail(fo\)o)@example.com>
          (foo) [email protected]
          [email protected] (foo)
          "Abi\"gail" <[email protected]>
          abigail@[example.com]
          abigail@[exa\[ple.com]
          abigail@[exa\]ple.com]
          ":sysmail"@ Some-Group. Some-Org
          Muhammed.(I am the greatest) Ali @(the)Vegas.WBA
          mailbox.sub1.sub2@this-domain
          [email protected]
          name:;
          ':;
          name: ;
          Alfred Neuman <Neuman@BBN-TENEXA>
          Neuman@BBN-TENEXA
          "George, Ted" <[email protected]>
          Wilt . (the Stilt) [email protected]
          Cruisers: Port@Portugal, Jones@SEA;
          $@[]
          *()@[]
          "quoted ( brackets" ( a comment )@example.com
          ======================================== =====
          Я хотел выделить такую регулярку, которая матчит только
          такие адреса "[email protected]"

          P.S.
          На самом деле, надо допилить мою регулярку,
          так как благодаря строке: my $word = "(?:$atom|$quoted_string)";
          она матчит ещё и такие адреса: "user name" <username@domain_name>
          Ответить
          • Особенно, третий.
            Я им в далеком '99 пользовался, чтобы зароучивать почту непосредственно на внутриконторские машины, а не на общий мейлсервер.
            Ответить
          • Сказано. Сделано.
            Вот регулярка матчит только адреса типа:

            [email protected]

            ^(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+)(?:\.(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+))*@(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+)(?:\.(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+))*$
            Ответить
    • да че вы так все усложнили - регулярки на полстраницы

      лучше бы у WebKillа поучились
      if (mail=="e-mail*" || mail.length<7) { error_text=error_text+"Введитье корьектный e-mail \n" }

      в одну строчку сделал, а вы с какими-то своими РФС-822
      Ответить
      • Можно поставить вопрос шире - кому сейчас может понадобиться первичная валидация e-mail? Разве что спамерам.
        Ответить
    • вот значит где собака зарыта...
      Ответить
    • показать все, что скрытоОчередной перебежчик из перловки на пхп. Узнаю их по ненужным {}.
      Ответить
      • Мусью! Хотя, я обычно не говорю такое незнакомым людям, но вы - упоротый!
        Нужность или ненужность фигурных скобок определяется исключительно соглашениями или принятыми стандартами оформления кода. Аналогично количеству табуляций в отступах и символе табуляций.
        Ответить
        • Arigato, видимо, покурил что-то такое эдакое часов 19 назад, и вот мерещится ему...
          Часто можно встретить его искренние и удивлённые высказывания, чуть ли не в каждом куске кода он узнаёт perl стиль...
          Бывает ведь...
          Ответить
          • Перловка у него в голове. Очень похож на мутировавшего из "где-здесь-язык-что-нельзя-называть-ников". Те тоже в каждом посте по теме и без любили писать всякую чепуху.
            Ответить
          • показать все, что скрытоДа ладно, юмора не понимаете что ли? :)
            Ответить
    • Повбывав бы!
      У меня из-за таких людей на каждом третьем ресурсе почту типа [email protected] зарубают. Говорят, что неправильный адрес, что б они понимали в неправильных адресах!
      Ответить
    • <?php
      
      	function checkmail($mail) {
      		if(preg_match('/^[^\W][a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,6}$/', $mail)) {
      				return true;					
      	} else {
      		return false;
      	}
      
      ?>
      Ответить
      • Обожаю такое:
        if (...) {return true;} else {return false;}
        Зря на PHP перешли, такие программисты на Perl важнее.
        Ответить
    • Сказано. Сделано.
      Вот регулярка матчит только адреса типа:

      [email protected]

      ^(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+)(?:\.(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+))*@(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+)(?:\.(?:[^()<>@,;:\\".\[\] \000-\037\177*&]+))*$
      Ответить

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