Часть веб-сайта, в котором я сейчас работаю, содержит процесс регистрации, в котором пользователи должны указать свой адрес электронной почты. Совсем недавно я узнал, что возможно использование доменов, не связанных с ascii (например, электронная почта). Мое бэкэнд – это кодировка, кодируемая utf-8, где я ожидаю, что любые пользователи (с разными локалями) смогут ввести свой адрес электронной почты, но не знают, как проверить этот вид адреса электронной почты.
В настоящее время я тестирую инструменты jquery и правильно проверяет английский адрес электронной почты, но не проверяет электронную почту без ascii. Также мне нужно сделать то же самое на стороне сервера с php. Существует ли регулярное выражение, которое может проверять этот адрес электронной почты?
Я пробовал это, но он не работает в jquery-инструментах (это просто пример для демонстрации, я тоже этого не понимаю)
闪闪 发光 @ 闪闪 发光 .com
Также, что произойдет, когда они напечатают свой английский адрес электронной почты (jonesmith@somemail.com) со своим собственным IME. Может ли это быть подтверждено с текущим регулярным выражением, которое мы имеем для проверки английской почты. В настоящее время мне не нужно беспокоиться, если это письмо существует для нет.
благодаря
Попытка проверить адреса электронной почты может быть не очень хорошей идеей. Спецификации ( RFC5321 , RFC5322 ) допускают такую гибкость, что проверка их правильными выражениями в буквальном смысле невозможна , а проверка с помощью функции – это большая работа. Результатом этого является то, что большинство схем проверки подлинности электронной почты в конечном итоге отклоняют большое количество действительных адресов электронной почты, в значительной степени к неудобствам пользователей. (Самым распространенным примером этого не является символ +
.)
Скорее всего, пользователь будет (случайно или намеренно) ввести неправильный адрес электронной почты, чем в недопустимом, поэтому на самом деле проверка является большой работой за очень небольшую выгоду, с возможными издержками, если вы сделаете это неправильно.
Я бы рекомендовал вам просто проверить наличие @
на клиенте, а затем отправить подтверждение на подтверждение, чтобы проверить его; это самый практичный способ проверки, и он подтверждает, что адрес правильный.
Начиная с 5.2 PHP имеет сборку для проверки адресов электронной почты . Но я не уверен, работает ли он для кодированных строк UFT-8:
echo filter_var($email, FILTER_VALIDATE_EMAIL);
В исходном исходном коде PHP вы найдете reg exp для проверки электронной почты, это можно использовать для проверки вручную при использовании PHP <5.2.
Обновить
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);
Как предложил Марио , немного поиграв, я придумал следующее регулярное выражение для проверки нестандартного адреса электронной почты:
^([\p{L}\.\-\d]+)@([\p{L}\-\.\d]+)((\.(\p{L}){2,63})+)$
Он будет проверять любой правильный адрес электронной почты со всеми типами символов Юникода, с ограничениями ДВУ от 2 до 63 символов.
Пожалуйста, проверьте его и сообщите мне, есть ли какие-либо недостатки.
Пример онлайн
reg exp может быть примерно так:
[^ ]+@[^ ]+\.[^ ]{2,6}
Получил эту идею на странице руководства 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 } } }
Хотя у него все еще есть некоторые дыры в петле, я думаю, что пользователи не будут обманывать это. Также реальная валидация требуется для серьезных вещей, как это предлагает «Джереми Бэнкс».
Надеюсь, это будет полезно и для кого-то другого.
Благодарю всех
На эту тему мне так понравилась эта страница, что я создал блог, в котором выставлены сайты, которые делают валидацию неправильной (вклады, полученные с благодарностью – не позволяйте вам быть на ней!).
Что касается использования регулярных выражений, те, которые говорят «это неправильно», имеют тенденцию быть легкими на альтернативах, и проверка TBH на последнюю букву RFC на самом деле не является критичной – например, в то время как noddy+!#$%&'*-/=?+_{}|~test@gmail.com
– абсолютно правильный адрес, не слишком необоснованно отклонять его, учитывая, что удивительно большая часть пользователей не может даже правильно набрать «hotmail». Некоторые домены также весьма ограничивают имена пользователей, особенно hotmail. Поэтому я сторонник регулярных выражений, которые явно разумны, и моим любимым источником для этой страницы является то , что мне не нравится их нынешний победитель JS, и это помогло бы, если бы они создали публичную тестовую страницу.
Плагин Validate для jQuery использует это регулярное выражение, которое интересно построено, очень похоже на стиль (но меньше!) на ex-parrot (фактически мой ISP!), связанный с @powtac.
что о чем-то это:
mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); mb_ereg('[\w]+@[\w]+\.com',$mail,'UTF-8');