Регулярки (url, email, phone)

Тема в разделе "Как сделать...", создана пользователем kuzmit42, 28 фев 2015.

  1. kuzmit42

    kuzmit42 Постоялец

    Регистр.:
    9 янв 2013
    Сообщения:
    131
    Симпатии:
    31
    Есть три регулярки проверяющие "адрес сайта, почту, и телефон"
    Люди с опытом гляньте пожалуйста, нет ли ошибок, и где могут быть подводные камни.
    Заранее Спасибо.
    PHP:
        //  удалить лишнее с домена
            
    $url1 = ($_POST["site"]);
            if (
    preg_match ("/^(http[s]{0,1}:\/\/){0,1}(www.){0,1}([a-zA-Zа-яёА-ЯЁ0-9_-]+\.[a-zA-Zа-яёА-ЯЁ]{2,4})\/{0,1}.*$/"$url1$h));
            
    $url $h[3];        
            echo 
    $url."<br />";
       
        
    //  Email
            
    $email $_POST['email'];
            
    $email preg_replace("|^([a-zA-Zа-яёА-ЯЁ0-9_\.\-]{1,20})@([a-zA-Zа-яёА-ЯЁ0-9\.\-]{1,20})\.([a-zA-Zа-яёА-ЯЁ]{2,4})|is"''$email);
            echo 
    "Email: ".$email."<br />";
           
        
    //  Телефон
            
    $phone $_POST['phone'];
            
    $phone preg_replace("/[^0-9]{6,20}/"''$phone);
            echo 
    "Телефон: ".$phone."<br />";
     
  2. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    149
    Симпатии:
    93
    ИМХО все кривые.

    К примеру, регулярка для емейла, реализованная по стандарту (RFC:(
    http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html

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

    PHP:
    $ cat 1.php
    <?php                                                                                        
    $phone 
    "+7 922 443-!22Bla-11";                                                            
    $phone preg_replace("/[^0-9]{6,20}/"''$phone);                                        
    echo 
    $phone;

    php 1.php                                                                  
    +7 922 443-!22Bla-11
    клево проверяет
     
    kuzmit42 нравится это.
  3. kuzmit42

    kuzmit42 Постоялец

    Регистр.:
    9 янв 2013
    Сообщения:
    131
    Симпатии:
    31
    Читал в инете что - RFC822 - устаревший формат и заменён на RFC2822
    Да и понту пользоваться их огромным кодом на лист А4

    По нулстрингу - я проверяю его перед добавлением данных в базу.
    PHP:
    if (!empty($email)) {
    // Если переменная не пуста то добавляем в базу
    }
    Да тут была ошибка, поправил так.
    PHP:
    $phone preg_replace("/[^0-9]{1,20}/"""$phone);
     
  4. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    149
    Симпатии:
    93
    Не проверяешь, потому что ты не знаешь что такое нуллбайт.

    так тоже не катит, а в RFC они такие длинные, потому что там люди знали что делали.
     
    kuzmit42 нравится это.
  5. Юлій Чирков

    Юлій Чирков Создатель

    Регистр.:
    21 апр 2015
    Сообщения:
    10
    Симпатии:
    36
    регулярки удобно проверять визуально сервисами типа http://regexper.com/
     
  6. denverkurt

    denverkurt Denve®

    Регистр.:
    23 дек 2013
    Сообщения:
    700
    Симпатии:
    384
    вместо {0,1} можно просто писать знак вопроса "https?"
    мыло проверяется неправильно, т.к. по вашим шаблонам, точка и тире могут стоять рядом с собакой, две точки вместе справа от собаки. не нужно изобретать велосипед, возьмите в интернете готовые примеры проверки почты, добавьте правила для кириллицы и все.

    телефон тоже проверяется неправильно. [^.......] этот символ внутри квадратных скобок обозначает что это могут быть любые символы, кроме указанных внутри скобок.
    если у вас телефоны в строго международном формате, то регулярку нужно писать примерно так:

    Код:
    ^\+\d+\s\d{3}\s\d{2}\-\d{2}$