Как проверить неанглийский (UTF-8) кодированный адрес электронной почты в Javascript и PHP? - PullRequest
10 голосов
/ 07 марта 2011

Часть веб-сайта, над которым я сейчас работаю, содержит процесс регистрации, где пользователи должны указать свой адрес электронной почты. Совсем недавно я узнал, что домены не на основе ascii возможны (как и электронная почта). Мой бэкэнд - это MySQL с кодировкой utf-8, где я ожидаю, что любые пользователи (с разными локалями) должны иметь возможность вводить свою электронную почту, но не знают, как проверить этот тип адреса электронной почты.

В настоящее время я тестирую инструменты jquery, и он корректно проверяет адрес электронной почты на английском языке, но не может проверить электронную почту не ascii. Также мне нужно сделать то же самое на стороне сервера с php. Существует ли регулярное выражение, которое может проверять этот тип адреса электронной почты?

Я пробовал это, но в инструментах jquery это не работает (это просто пример для демонстрации, я тоже не понимаю)

闪闪 发光 @ 闪闪 发光 .com

Также, что произойдет, когда они введут свой электронный адрес на английском языке (jonesmith@somemail.com) со своим собственным IME. Можно ли это проверить с помощью текущего регулярного выражения, которое мы имеем для проверки английской почты. В настоящее время я не должен волноваться, существует ли это электронное письмо для не.

Спасибо

Ответы [ 7 ]

14 голосов
/ 07 марта 2011

Попытка проверить адреса электронной почты не может быть хорошей идеей. Спецификации ( RFC5321 , RFC5322 ) обеспечивают такую ​​большую гибкость, что проверка их с помощью регулярных выражений буквально невозможна , а проверка с помощью функции - большая Работа. Результатом этого является то, что большинство схем проверки электронной почты в конечном итоге отклоняют большое количество действительных адресов электронной почты, что приводит к большим неудобствам для пользователей. (Наиболее распространенным примером этого является недопустимость символа +.)

Скорее всего, пользователь (случайно или преднамеренно) введет неправильный адрес электронной почты, чем неверный, поэтому проверка подлинности - это большая работа, приносящая очень мало пользы, с возможными расходами, если вы сделаете это неправильно.

Я бы порекомендовал вам просто проверить наличие символа @ на клиенте, а затем отправить электронное письмо с подтверждением для подтверждения; это самый практичный способ проверки и он также подтверждает правильность адреса.

3 голосов
/ 07 марта 2011

Начиная с 5.2 PHP имеет встроенную проверку для адресов электронной почты . Но я не уверен, работает ли он для строк в кодировке UFT-8:

echo filter_var($email, FILTER_VALIDATE_EMAIL);

В исходном исходном коде PHP вы найдете reg exp для проверки электронной почты, его можно использовать для ручной проверки при использовании PHP <5.2. </p>

Обновление

idn_to_ascii() можно использовать для «Преобразования доменного имени в форму IDNA ASCII». Который затем может быть подтвержден с помощью filter_var($email, FILTER_VALIDATE_EMAIL);

// International domains
if (function_exists('idn_to_ascii') && strpos($email, '@') !== false) {
    $parts = explode('@', $email);
    $email = $parts[0].'@'.idn_to_ascii($parts[1]);
}
$is_valid = filter_var($email, FILTER_VALIDATE_EMAIL);
2 голосов
/ 08 января 2014

Как предложил Марио , немного поиграв, я предложил следующее регулярное выражение для проверки нестандартного адреса электронной почты:

^([\p{L}\_\.\-\d]+)@([\p{L}\-\.\d]+)((\.(\p{L}){2,63})+)$

Это подтвердит любой правильный адрес электронной почтысо всеми видами букв Unicode, с ограничениями TLD от 2 до 63 символов.

Пожалуйста, проверьте его и дайте мне знать, если есть какие-либо недостатки.

Пример Online

0 голосов
/ 12 июля 2012

На эту тему мне настолько понравилась эта страница , что я создал блог, на котором размещены сайты, которые неправильно выполняют валидацию (материалы с благодарностью получены - не позволяйте вашим присутствовать на них! ).

Что касается использования регулярных выражений, те, которые говорят "это неправильно", как правило, не обращают внимания на альтернативы, и проверка TBH до последней буквы RFC на самом деле не так критична - например, в то время как noddy+!#$%&'*-/=?+_{}|~test@gmail.com является Совершенно действительный адрес, его отклонение не так уж и необоснованно, учитывая, что удивительно большой процент пользователей не может даже правильно набрать «hotmail». В любом случае, некоторые домены также очень ограничивают имена пользователей, особенно hotmail. Таким образом, я поддерживаю регулярные выражения, которые являются наглядно обоснованными, и мой любимый источник для этого - эта страница , хотя мне не нравится их текущий победитель JS, и было бы полезно, если бы они создали общедоступная тестовая страница.

плагин проверки jQuery использует это регулярное выражение , которое интересно построено, довольно похоже по стилю (но меньше!) На экс-попугая (на самом деле мой ISP!), Связанное с @ Powtac.

0 голосов
/ 08 марта 2011

Получил эту идею со Учебник Javascript . Это базовое решение, но оно работает для меня, не беспокоясь о сложности регулярных выражений и стандартов Unicode.

Проверка на стороне клиента

if(!$.trim(value).length) {
    return false;
}
else {

    AtPos = value.indexOf("@");
    StopPos = value.lastIndexOf(".");

    if (AtPos == -1 || StopPos == -1) {
        return false;
    }

    if (StopPos < AtPos) {
        return false;
    }

    if (StopPos - AtPos == 1) {
        return false;
    }

    return true;
}

Проверка на стороне сервера

if(!isset($_POST['emailaddr']) || trim($_POST['emailaddr']) == "") {
    //Error: Email required
}
else {
    $atpos = strpos($_POST['emailaddr'],'@');
    $stoppos = strpos($_POST['emailaddr'],'.');

    if(($atpos === false) || ($stoppos === false)) {
        //Error: invalid email
    }
    else {
        if($stoppos < $atpos) {
            //Error: invalid email
        }
        else {
            if (($stoppos-$atpos) == 1) {
            //Error: invalid email
        }
    }
}

Хотя у него все еще есть некоторые дыры в петлях, я думаю, что пользователи не будут дурачиться с этим материалом. Также реальная проверка требуется для серьезных вещей, как это было предложено Джереми Бэнксом.

Надеюсь, это будет полезно и для кого-то еще.

Спасибо и всего наилучшего

0 голосов
/ 07 марта 2011

что-то такое:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
mb_ereg('[\w]+@[\w]+\.com',$mail,'UTF-8');
0 голосов
/ 07 марта 2011

Рег. Опыт может быть примерно таким:

[^ ]+@[^ ]+\.[^ ]{2,6}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...