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

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

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

В настоящее время он использует функцию PHP eregi, которая, по словам 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';
    }
}

Ответ 1

Образцы регулярных выражений в стиле 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';
    }
}

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

Ответ 2

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

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

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

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i"