Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регулярные выражения проверка e-mail адреса
 
 автор: kievigor   (09.05.2006 в 14:52)   письмо автору
 
 

Вот тестировал шаблон мейла, которым пользуются практически все и натолкнулся на такую вещь. В слове которое написано до собаки оказывается можно употреблять любые символы, главное чтоб последний символ был допустимыми, а остальное можно лепить что угодно, в том числе и любое количество собак. Так и до скрипта не далеко. Глядя на регулярное выражение, создается впечатление, что этого не должно быть. Может кто подскажет как с этим бороться. Я понимаю, что сначала можно проверить на допустимые символы, а потом на шаблон, но может можно шаблон подправить трак, что он не будет пропускать ошибки.

<?php

$mail = "something@server.com"; // Ошибок нет
$mail = "@@@!:;#$%^&*()-=[]/\.,_+g@server.com"; // Ошибок тоже как ни странно нет

if(preg_match("/[0-9a-zA-z_]+@[0-9a-zA-Z_^\.]+\.[a-z]{2,3}/i", $mail))
echo("Ошибок нет");
else
echo("Ошибка");

?>

   
 
 автор: isset   (09.05.2006 в 15:02)   письмо автору
 
   для: kievigor   (09.05.2006 в 14:52)
 

if(preg_match("/^[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}$/i", $mail))

   
 
 автор: kievigor   (09.05.2006 в 16:12)   письмо автору
 
   для: isset   (09.05.2006 в 15:02)
 

Спасибо.
Маленький нюанс и работает правильно. Просто этот пример приведен во многих статьях и скриптах именно в таком виде как я его показал. Странно что все переписывают друг у друга с ошибкой и никто не проверяет его работу.

   
 
 автор: kievigor   (09.05.2006 в 16:39)   письмо автору
 
   для: isset   (09.05.2006 в 15:02)
 

Все таки нужно еще добавить черточку, а то часто встречаются такие мейлы

some-thing@ser-ver.com

preg_match("/^[0-9a-z_\-]+@[0-9a-z_\-^\.]+\.[a-z]{2,3}$/i", $mail)

   
 
 автор: aazon   (12.05.2006 в 17:49)   письмо автору
 
   для: kievigor   (09.05.2006 в 16:39)
 

Кстати, еще бывают адреса почты типа
mr.good@mail.ru, тоесть с точкой до собачки
поэтому предлагаю еще дописать
preg_match("/^[0-9a-z_\-\.]+@[0-9a-z_\-^\.]+\.[a-z]{2,3}$/i", $mail)

А еще, хотя я точно не уверен, имя до собачки должно быть не менее 3 символов, но я могу ошибаться...

   
 
 автор: Trianon   (12.05.2006 в 18:17)   письмо автору
 
   для: kievigor   (09.05.2006 в 16:39)
 

любой такой фильтр допускает ошибки как первого, так и второго рода.
Т.е. отвергает некоторое количество реальных адресов и пропускает некоторое количество несуществующих.
Достаточно вспомнить об адресах на доменах первого уровня или на доменах *.info

   
 
 автор: cheops   (13.05.2006 в 11:27)   письмо автору
 
   для: Trianon   (12.05.2006 в 18:17)
 

>Достаточно вспомнить об адресах на доменах первого уровня
>или на доменах *.info
Или .travel, поэтому {2,3} лучше исправить на {2,6} - будет покрайней мере не хуже
<?php
preg_match
("/^[-0-9a-z_\.]+@[-0-9a-z_]+\.[a-z]{2,6}$/i"$mail)
?>

   
 
 автор: Sergey89   (16.05.2006 в 17:26)   письмо автору
 
   для: cheops   (13.05.2006 в 11:27)
 

Кстати, а что насчёт адреслв почты на домене третбего и т.д. уровня? Т.ч. ещё и точку надо разрешить бы.

<?php 
preg_match
("/^[-0-9a-z_\.]+@[-0-9a-z_\.]+\.[a-z]{2,6}$/i"$mail
?> 

   
 
 автор: Freddie_X   (18.05.2006 в 23:12)   письмо автору
 
   для: Sergey89   (16.05.2006 в 17:26)
 

А как сделать, чтобы разрешало оставить поле пустым, но если что-то написано, то проверялось вышенаписанным регулярным выражением?

   
 
 автор: cheops   (18.05.2006 в 23:21)   письмо автору
 
   для: Freddie_X   (18.05.2006 в 23:12)
 

Для этого необходимо проверить сначала пусто поле или нет, а если нет - проверять его при помощи регулярного выражения
<?php
  
if(!empty($_POST['mail']))
  {
    if(
preg_match("/^[-0-9a-z_\.]+@[-0-9a-z_\.]+\.[a-z]{2,6}$/i"$_POST['mail']))
    {
      exit(
"Не верный формат URL-запроса");
    }
  }
?>

   
 
 автор: Freddie_X   (19.05.2006 в 09:30)   письмо автору
 
   для: cheops   (18.05.2006 в 23:21)
 

А может лучше сделать так, чтобы прямо в регулярном выражении допускалось "пусто" ЛИБО

"/^[-0-9a-z_\.]+@[-0-9a-z_\.]+\.[a-z]{2,6}$/i"

?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования