Соответствие регулярному выражению проверки PHP на стороне сервера

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

$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
}

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

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

Кто-нибудь знает или знает, почему?

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

Спасибо! Амит


person Amit    schedule 14.08.2010    source источник


Ответы (3)


Ваше регулярное выражение включает только [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 будут довольны вашей, так как они смогут использовать плюс псевдонимы, которые ошибочно отвергаются многими валидаторами.

person MvanGeest    schedule 14.08.2010
comment
Отлично, это помогло. Отмечу это как правильный ответ, как только SO позволит мне :) - person Amit; 15.08.2010

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

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

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

person strager    schedule 14.08.2010
comment
Ну вот, ха-ха. Очевидно, я хреново читаю!! Спасибо, что прояснили это для меня. - person Amit; 15.08.2010

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

person Rushyo    schedule 14.08.2010