В названии электронной почты разрешены следующие символы
- Заглавные и строчные буквы латинского алфавита (a-z, A-Z), хотя с сегодняшним бумом на национальные домены, я думаю, что все буквы уже разрешены.
- Цифры 0-9
- Символы ! # $ % & ' * + - / = ? ^ _ ` { | } ~
- Точка (.) Но если она стоит не в начале, не в конце и их не две подряд.
1. Допустим есть емайл
$email= " .Jб,! # $ % & ' * + - / = ? ^ _ ` { | } ~ohn#% ^.@@@@&*()@(.doe)@.ex_-a//m#p%l...e.com. ";
2. Применим очищающий фильтр FILTER_SANITIZE_EMAIL, который удаляет все символы, кроме букв, цифр и !#$%&'*+-=?^_`{|}~@.[]
$email = filter_var ( $email, FILTER_SANITIZE_EMAIL);
3. Удалим повторяющиеся точки
$email = preg_replace('/\.{2,}/', ".", $email );
4. Разделим емайл на имя и домен по последнему символу собаки @
preg_match('/(.*)@(.*)$/', $email, $arResult);
$arResult[1]; //имя
$arResult[2]; //домен
5. Вычистим имя
$arResult[1] = preg_replace('/^\./', "", $arResult[1]); //удаляем первый символ точки
$arResult[1] = preg_replace('/\.$/', "", $arResult[1]); //удаляем последний символ точки
$arResult[1] = preg_replace('/@/', "", $arResult[1]); //удаляем собачки
6. Вычистим домен
$arResult[2] = preg_replace('/^\./', "", $arResult[2]); //удаляем первый символ точки
$arResult[2] = preg_replace('/\.$/', "", $arResult[2]); //удаляем последний символ точки
$arResult[2] = preg_replace('/[^a-z0-9_\.-]/iu', "", $arResult[2]); //удаляем все запрещенные символы в домене кроме, латинских букв, точек, знака тире и нижнего подчеркивания
7. Удалим, т.к. там лежит еще не обработанный email из 3 пункта
unset($arResult[0]);
8. Выведем результат
$strResult = implode("@", $arResult);
print "<pre>";print_r($strResult);print "</pre>";
Если у кого есть дополнения или более изящный вариант решения, напишите пожалуйста