Соответствие регулярного выражения проверки на стороне сервера PHP - PullRequest
0 голосов
/ 15 августа 2010

У меня есть следующая часть сценария проверки:

$invalidEmailError .= "<br/>&raquo;&nbsp;You did not enter a valid E-mail address";    
$match = "/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/";

Это выражение, вот проверка:

if ( !(preg_match($match,$email)) ) {
    $errors .= $invalidEmailError; // checks validity of email
}

Я думаю, что достаточно информации, дайте мне знать, если потребуется больше.

По сути, возникает сообщение "Вы не ввели действующий адрес электронной почты" независимо от того, что . Введен ли правильный адрес электронной почты или неправильный адрес электронной почты.

У кого-нибудь есть идеи или подсказки, почему?

РЕДАКТИРОВАТЬ: я запускаю это на localhost (используя Apache), может ли это быть причиной того, почему preg_match не работает?

Спасибо! Amit

Ответы [ 3 ]

3 голосов
/ 15 августа 2010

Ваше регулярное выражение включает только [A-Z], а не [a-z]. Попробуйте

$match = "/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i";

, чтобы сделать регулярное выражение без учета регистра.

Вы можете проверить это в прямом эфире на http://regexpal.com.

Однако я бы посоветовал вам попробовать одно из выражений на странице, упомянутых strager : http://fightingforalostcause.net/misc/2006/compare-email-regex.php. Они были усовершенствованы с течением времени и, вероятно, будут вести себя лучше. Но пользователи Gmail будут довольны вашим, поскольку они смогут использовать плюс псевдонимы , которые отклоняются многими валидаторами неправильно.

1 голос
/ 15 августа 2010

Скорее всего, вы используете регулярное выражение из регулярных выражений.info . На этой странице автор заявляет (выделение добавлено):

Если вы хотите использовать приведенное выше регулярное выражение, вам нужно понять две вещи. Во-первых, длинные регулярные выражения затрудняют правильное форматирование абзацев. Поэтому я не включил a-z ни в один из трех классов персонажей. Это регулярное выражение предназначено для использования с включенной опцией "без учета регистра" в вашем механизме регулярных выражений. (Вы будете удивлены, сколько сообщений об ошибках я получаю об этом.) Во-вторых, приведенное выше регулярное выражение разделено с границами слов, что делает его пригодным для извлечения адресов электронной почты из файлов или больших блоков текста. Если вы хотите проверить, вводил ли пользователь действительный адрес электронной почты, замените границы слова на якоря начала строки и конца строки, например: ^ [A-Z0-9 ._% + -] + @ [А-Z0-9 .-] +. [AZ] {2,4} $.

Чтобы решить эту проблему, добавьте флаг i PCRE после вашего регулярного выражения.

0 голосов
/ 15 августа 2010

Вы всегда можете попробовать отладить свое регулярное выражение, используя более простой инструмент (я очень люблю использовать Notepad ++ для этой цели) и выполнять итерационные тесты - т.е.сделать выражение более / менее сложным и посмотреть, исправит ли это или сломает вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...