Регулярное выражение электронной почты PHP по-прежнему позволяет 2point сразу после друг друга - PullRequest
0 голосов
/ 11 августа 2009

В PHP я использую это регулярное выражение для проверки почты:

$rexMail = "/^[a-z0-9\._]+@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";

В большинстве случаев этого будет достаточно. Однако этот почтовый адрес оказывается действительным для регулярного выражения:

test..test @ test.com

Это не должно быть возможно. Хотя до знака @ должно быть разрешено несколько точек, сразу после друг друга не должно быть нескольких точек.

Я не , что хорошо справляется с регулярным выражением, и я не знаю, как это решить.

Кроме того, я не слишком уверен относительно количества точек после знака @, поскольку существуют такие почтовые адреса, как .co.uk или худший.

Ответы [ 5 ]

3 голосов
/ 11 августа 2009

Во-первых, test..test @ example.com - это абсолютно действительный адрес электронной почты. Там нет ничего, что говорит, что адрес электронной почты не может иметь несколько последовательных символов точки перед знаком @. Фактически, перед символом @ может быть что угодно, включая некоторые символы, которые вы не разрешаете (например, +). Таким образом, вы будете отклонять множество совершенно правильных адресов, как вы написали это сейчас.

См. http://www.regular -expressions.info / email.html для прямого выражения, которое поможет, наряду с некоторым объяснением того, почему проверка адреса электронной почты обычно сбивается при использовании с регулярными выражениями .

1 голос
/ 11 августа 2009

Проблема в том, как работают классы символов: класс символов, такой как [a-z0-9 ._] +, означает «один из них - с этим правилом, примененным один или несколько раз». По сути, в правилах класса символов нет ничего такого, что нельзя повторять символы.

Хитрость в том, что вы хотите разделить «слова» точками, и вы должны принять во внимание эту группировку.

Рассмотрим что-то вроде этого:

$rexMail = "/^[a-z0-9_]+(\.[a-z0-9_]+)*@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";

Это в основном говорит: «одно слово (состоящее из буквенно-цифровых или подчеркиваний), затем ДОПОЛНИТЕЛЬНО (ноль или более раз) точка, за которой следует другое слово». (И это можно повторять столько раз или несколько раз, сколько хотите)

Кстати, квантификатор {1} никогда не нужен, потому что по умолчанию, если вы не укажете квантификатор, механизм регулярных выражений ищет его ровно один раз.

1 голос
/ 11 августа 2009

Здесь:

/^([a-z0-9_]\.?)*[a-z0-9_]+@([a-z0-9-_]+\.)+[a-z]{2,3}$/i

Часть адреса электронной почты после @ потенциально может быть любым действительным доменом, поэтому вам нужно разрешить любое количество элементов, разделенных .TLD выше TLD - например, email.staff.mycompany.com является допустимым хостом. Кроме того, домен верхнего уровня может содержать более 2 символов; многие из них - 3 (.com, .net и т. д.).

Однако приведенный ниже комментарий VoteyDisciple действителен - технически, адрес электронной почты может содержать ...

0 голосов
/ 11 августа 2009

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

Вот библиотека PHP для проверки синтаксиса электронной почты: http://code.google.com/p/php-email-address-validation/

На самом деле довольно сложно проверить электронную почту, не отправив им письмо. Но проверка SMTP работает в большинстве случаев, хотя ошибки также следует рассматривать как возможные ошибки, а не как реальные ошибки.

Вот класс, который будет проверять электронную почту через SMTP: http://code.google.com/p/php-smtp-email-validation/

0 голосов
/ 11 августа 2009

Может оказаться полезным http://www.regular -expressions.info / email.html . Практически невозможно осуществить проверку действительного адреса электронной почты, используя только регулярные выражения. Однако эта страница затрагивает несколько вариантов.

Я склонен использовать тот, который находится внизу страницы. Я нашел его подходящим для большинства случаев использования веб-приложений и немного изменил его для работы с экранированием PHP:

//courtesy of http://www.regular-expressions.info/email.html, modified to be escaped for PHP string and preg_match
$exp = '[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
if (! preg_match('/^'.$exp.'$/i', $email)) return false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...