Как изменить eregi PHP на preg_match

Возможный дубликат:
Как преобразовать выражения ereg в preg в PHP?

Мне нужна помощь, ниже приведено небольшое ОЧЕНЬ простое регулярное выражение для некоторой проверки электронной почты, я понимаю, что оно не работает лучше всего, но для моих нужд это пока нормально.

В настоящее время он использует функцию eregi PHP, которая, по словам php.net, теперь является устаревшей функцией, и вместо этого я должен использовать preg_match, простая замена erei на preg_match не работает, может кто-нибудь показать мне как заставить его работать?

function validate_email($email) {
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}
function validate_email($email) {
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}

person JasonDavis    schedule 03.09.2009    source источник
comment
Обратите внимание, что вы не должны использовать это регулярное выражение для проверки электронной почты; он сильно устарел.   -  person Piskvor left the building    schedule 22.10.2014
comment
@Piskvor Я согласен, этому вопросу тоже почти 5 лет =) вы должны опубликовать обновленный ответ, если хотите, и я всегда могу изменить выбранный ответ на лучший подход   -  person JasonDavis    schedule 22.10.2014
comment
Это ИМХО выходит за рамки проблемы ereg/preg; комментариев мне кажется достаточно.   -  person Piskvor left the building    schedule 22.10.2014


Ответы (2)


Шаблоны регулярных выражений в стиле Perl всегда должны быть разделены. Самый первый символ в строке считается разделителем, поэтому примерно так:

function validate_email($email) {
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) {
        echo 'bad email';
    } else {
        echo 'good email';
    }
}

Причина, по которой ваша первоначальная попытка не сработала, заключается в том, что она пыталась использовать ^ в качестве символа-разделителя, но (очевидно) не нашла соответствия ^ для конца регулярного выражения.

person Amber    schedule 03.09.2009
comment
Спасибо, я только что нашел php FILTER_VALIDATE_EMAIL, кажется, это лучший способ, но я не могу найти много информации об этом. - person JasonDavis; 03.09.2009
comment
@jasondavis, FILTER_VALIDATE_EMAIL определенно был бы лучшим выбором. Электронные письма сложны. - person TRiG; 27.06.2011

Вам нужно будет изменить три вещи

  1. необходимо добавить разделители шаблонов (может быть любой символ, но чаще всего косая черта)
  2. [[:alnum:]] необходимо заменить эквивалентом PCRE
  3. «i» в «eregi» означает регистронезависимость, что PCRE делает с флагом, в частности с флагом i.

В противном случае остальное выглядит совместимым с PCRE (да, это избыточно =P)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i"
person Peter Bailey    schedule 03.09.2009
comment
PHP PCRE включает такие вещи, как [:alnum:] в качестве опций. - person Amber; 03.09.2009