@gregorypetrov

Почему эта регулярка не пропускает эмэйлы с кириллическими доменами, и как правильно?

/[A-Za-zа-яА-ЯёЁ0-9._-]+@[A-Za-zа-яА-ЯёЁ0-9._-]+\.[A-Za-zа-яА-ЯёЁ]{2,4}/

<?php

$email = "mail@сайт.рф";

if (!preg_match("/[A-Za-zа-яА-ЯёЁ0-9._-]+@[A-Za-zа-яА-ЯёЁ0-9._-]+\.[A-Za-zа-яА-ЯёЁ]{2,4}/", $email)) {
    echo "ERROR";
} else {
    echo "Ok";
}


Если убрать а-яА-ЯёЁ , то латинские эмэйлы пропускает, т.е. в принципе регулярка верная, но почему-то не работает для кириллицы при добавлении а-яА-ЯёЁ в правило.
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
@neol
У вас там unicode, для корректной работы с которым к шаблону нужно добавить флаг u, чтобы получилось как-то так
<?php

$email = "mail@сайт.рф";

if (!preg_match("/[A-Za-zа-яА-ЯёЁ0-9._-]+@[A-Za-zа-яА-ЯёЁ0-9._-]+\.[A-Za-zа-яА-ЯёЁ]{2,4}/u", $email)) {
    echo "ERROR";
} else {
    echo "Ok";
}


А если выпить кофе и окончательно проснуться, то получится что-то типа
if (!preg_match("/[\w._-]+@[\w._-]+\.[\w]{2,4}/u", $email)) {
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
fzfx
@fzfx
18,5 дм
потому что punycode.
например, то, что вы видите как пример.рф, в доменной зоне у регистратора прописано как xn--e1afmkfd.xn--p1ai. с наскоку как минимум не удовлетворяет вашему [A-Za-zа-яА-ЯёЁ]{2,4}.
как правильно - зависит от задачи. если пропускать домены с кириллическими именами - исправьте то, что пометил, сняв ограничение на длину и добавив в список валидных символов цифры и знак дефиса. если валидировать любые e-mail адреса - оставить только проверку на символ @ и наличие как минимум одного символа в локальной и доменной частях e-mail.
Ответ написан
@4iloveg
Full-Stack HTML Developer
Показывает что ок. https://regex101.com/r/FGyuHK/1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы