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

kuzmit42

Постоялец
Регистрация
9 Янв 2013
Сообщения
132
Реакции
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 />";
 
ИМХО все кривые.

К примеру, регулярка для емейла, реализованная по стандарту (RFC:(
Для просмотра ссылки Войди или Зарегистрируйся

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

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

клево проверяет
 
ИМХО все кривые.
К примеру, регулярка для емейла, реализованная по стандарту (RFC:(
Для просмотра ссылки Войди или Зарегистрируйся
Читал в инете что - RFC822 - устаревший формат и заменён на RFC2822
Да и понту пользоваться их огромным кодом на лист А4

По нулстрингу - я проверяю его перед добавлением данных в базу.
PHP:
if (!empty($email)) {
// Если переменная не пуста то добавляем в базу
}

клево проверяет
Да тут была ошибка, поправил так.
PHP:
$phone = preg_replace("/[^0-9]{1,20}/", "", $phone);
 
Не проверяешь, потому что ты не знаешь что такое нуллбайт.

так тоже не катит, а в RFC они такие длинные, потому что там люди знали что делали.
 
вместо {0,1} можно просто писать знак вопроса "https?"
мыло проверяется неправильно, т.к. по вашим шаблонам, точка и тире могут стоять рядом с собакой, две точки вместе справа от собаки. не нужно изобретать велосипед, возьмите в интернете готовые примеры проверки почты, добавьте правила для кириллицы и все.

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

Код:
^\+\d+\s\d{3}\s\d{2}\-\d{2}$
 
Назад
Сверху