Intereting Posts
vsprintf или sprintf с именованными аргументами или простой анализ шаблонов в PHP ZF2 отключает прослушиватель от EventManager Как перемещать разделенные запятыми идентификаторы из одной строки в другую? Safari не показывает длительность mp3, поданного с php, правильно Существует ли стандартный скелет или инструкции для создания пакета Symfony2 с открытым исходным кодом в комплекте с travis-ci и композитором? Неустранимая ошибка: вызов неопределенного метода GuzzleHttp \ Client :: request () с помощью Guzzle 6 Какая была ваша любимая функция, которая была введена в PHP 5.3? Сколько мне стоит выбрать ASP.NET через PHP? Как выполнить поиск из поля сериализации в базе данных mysql? Есть ли способ заставить PHP постепенно выводиться по мере выполнения скрипта? Получить ObjectId MongoDB через PHP PHP ajax-вызов, не отображающий ie7 или 8 В cakephp, как я могу найти с условиями в соответствующей области? PHP strtotime возвращает неверные результаты цикл foreach и ссылка & $ value

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

Часть веб-сайта, в котором я сейчас работаю, содержит процесс регистрации, в котором пользователи должны указать свой адрес электронной почты. Совсем недавно я узнал, что возможно использование доменов, не связанных с 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');