Как изменить eregi PHP на 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';
    }
}

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';
    }
}

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

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

  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"
Другие вопросы по тегам