!preg_match для проверки электронной почты

У меня есть эта команда для проверки действительного адреса электронной почты. Я только что узнал, что когда я пытаюсь добавить это на наш почтовый сервер (все запросы электронной почты из этой формы являются локальными адресами электронной почты), почтовый сервер не позволяет использовать числовой символ для начала адреса электронной почты / имени пользователя. Я прочитал всю документацию по команде preg_match и не могу найти, как сделать так, чтобы она не удалась, если она начинается с числа в позиции первого символа. Я новичок, поэтому любая помощь будет оценена по достоинству.

if (!preg_match("(^[-\w\.]+@([-a-z0-9]+\.)+[a-z]{2,4}$)i", $in_email))

person Jim B    schedule 15.11.2012    source источник


Ответы (3)


Попробуй это;

/^[^0-9][_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/

И использовать следующим образом

$regex = '/^[^0-9][_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';

if (preg_match($regex, $email)) {
    // Valid email
} else { 
    // Invalid email
}
person Tolga Akyüz    schedule 15.11.2012
comment
Я добавил это, и это делает так, что числа вообще не разрешены. Я хочу, чтобы числа использовались, если они этого хотят, но не в местах первого символа. - person Jim B; 15.11.2012
comment
хорошо, обновил ответ, пожалуйста, проверьте ответ и примите, если он решит вашу проблему. - person Tolga Akyüz; 15.11.2012
comment
Идеально - большое спасибо! Я пытался понять это в течение нескольких дней. - person Jim B; 15.11.2012
comment
Если вы хотите получить ответ на свои будущие вопросы, вы должны принять ответы как правильные, если это поможет вам разобраться. Поэтому, пожалуйста, просмотрите ответ и нажмите значок галочки слева, чтобы принять его. - person Tolga Akyüz; 16.11.2012
comment
Это позволит отправлять электронные письма, начинающиеся с пробела, @ или любого другого символа, кроме цифры. - person Toto; 12.10.2013

В php вы можете использовать следующий код с функцией php filter_var, которая возвращает логическое значение после фильтрации переменной с указанным условием фильтрации.

 if(filter_var($email,FILTER_VALIDATE_EMAIL))
        { 
        //valid email
        }
        else{
        //INVALID EMAIL
        }

Функция filter_var вернет true, если электронная почта имеет правильный формат, в противном случае — false.

person Devang    schedule 29.10.2020

Если у нас есть домены без точек, этот ответ не работает. Для этого случая я изменился с:

/^[^0-9][_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/

To:

/^[^0-9][_a-z0-9-]+(\.[_a-z0-9-]+)*@([a-z0-9-]{2,})+(\.[a-z0-9-]{2,})*$/

Обновление: пользователь @Toto правильно заметил одну проблему с регулярным выражением, которое может начинаться с любых символов, а не с числа. И пример вроде: @-----.--.---.----@-- прошел валидацию. Поэтому я изменил /^[^0-9] на /^[a-z] и теперь правильно:

/^[a-z][_a-z0-9-]+(\.[_a-z0-9-]+)*@([a-z0-9-]{2,})+(\.[a-z0-9-]{2,})*$/

И работайте для этих вариантов использования:

person Otávio C A Serra    schedule 02.04.2021
comment
Это соответствует, например, @-----.--.---.----@--, но не уверен, что это действующий адрес электронной почты! Пожалуйста, взгляните на эти сайты: список TLD; действительные/недействительные адреса; регулярное выражение для адреса электронной почты RFC822 - person Toto; 03.04.2021
comment
Эй, Отавио! Добро пожаловать в StackOverflow! Похоже, вы уже получили удовлетворительный ответ, но другим людям было бы полезно перефразировать свои вопросы. Тысячи людей ищут в Google похожие проблемы, и четко сформулированный вопрос может помочь им попасть сюда, чтобы избежать тех же проблем, через которые приходится пройти вам. Не могли бы вы уточнить вопрос, пожалуйста? - person Brad Cypert; 06.04.2021
comment
@BradCypert ответ, помеченный как правильный от пользователя tolga-akyüs, не работает, если в домене нет точек. Например: [email protected] действителен с использованием его регулярного выражения, но не проверяется, есть ли у вас электронная почта, например: my@domain . Итак, я использовал регулярное выражение из его ответа и изменил его на то, которое проверяет домены с точками или без них. Сегодня 2021 у нас есть домены без точек. - person Otávio C A Serra; 07.04.2021
comment
@Toto этот ваш пример невозможно проверить с помощью моего регулярного выражения, потому что регулярное выражение начинается с /^[^0-9][_a-z0-9-]+, что точно говорит нам: начальный символ строки не должен быть числовым [ ^0-9] и должен быть _ или az или 0-9 одним или несколькими подобными символами в части этого регулярного выражения [_a-z0-9-]+. Кроме того, возможен только один символ @. Я пробовал много решений здесь, в стеке, но для доменов без точек все, что я пробовал, не удалось. Итак, я не знаю, пробовал ли я все, что вы мне здесь показали. - person Otávio C A Serra; 07.04.2021
comment
вот доказательство того, что ваше регулярное выражение соответствует (например) @-----.--.---.----@-- - person Toto; 07.04.2021
comment
@Тото ты прав! Я сам попробовал ваш вариант использования и изменил его /^[^0-9] на /^[a-z], и теперь это не подтвердило @-----.--.---.----@--. Я обновлю свой пост и размещу эту информацию. Спасибо. - person Otávio C A Serra; 07.04.2021