Пожалуйста, не пытайтесь проверять адреса электронной почты с помощью регулярных выражений;это колесо, которое не нуждается в переизобретении, и если вы не напишете ужасно волосатое регулярное выражение, вы пропустите недействительные адреса электронной почты или отклоните действительные.
В CPAN существует множество модулей, таких как Email :: Valid , который позаботится обо всем за вас и будет проверен и протестирован.
Простой пример:
use Email::Valid;
print (Email::Valid->address('someone@example.com') ? 'yes' : 'no');
Гораздо проще, и будет просто работать.
В качестве альтернативы можно использовать Mail :: RFC822 :: Address :
if (Mail::RFC822::Address::valid('someone@example.com')) { ...}
Пример того, насколько волосатым должно быть регулярное выражение для успешной обработки всехАдреса, совместимые с RFC822, взгляните на эту красоту .
Люди, которые пытаются вручную сверять свою собственную проверку адреса электронной почты, как правило, в конечном итоге получают код, который позволяет синтаксически неверным адресам проскальзывать черези, что еще хуже, отклонять совершенно правильные адреса.
Например, некоторые люди используют +
в своем адресе, например bob+amazon@example.com
- это называется «адресным тегом» или «подадресацией».Несколько наивных попыток валидации откажут в этом, и клиент в конечном итоге отправится куда-то еще.
Кроме того, в прошлом некоторые люди полагали, что TLD всегда будет состоять из 2 или 3 символов;когда, например, .info
был запущен, людям с адресами в этих доменах сказали бы, что их совершенно действительный адрес электронной почты не приемлем.
Наконец, есть некоторые патологические случаи, такие как "Mickey Mouse"@example.com
, bob@[1.2.3.4]
которые синтаксически допустимы, но валидация валидации большинства людей откажется.