Чистый пользователь представил входные данные случайного или преднамеренного мусора. Я написал следующее, чтобы сделать это, и мне было бы интересно увидеть более эффективные или лучшие решения той же проблемы. Примечание. Я использую подготовленные операторы mysqli после них на стороне mysql.
Первый случай: пользователь должен иметь возможность вводить символы UTF-8 (необходимы только русский, турецкий, английский) и '_', (это для очистки ввода пользователем имени пользователя) эм>.
входы:
$lang1 = " \ $:;/<ŞĞğş43\24234şğ_Ğüğsdç<a> #$#@!@^%*&^( <b></b>";
$lang2 = "еукд $ :;363 леВАЛДЖЫу-_жлаывф<em>вфы34234</em>вфывф#@!@^%*&^(&*)(()&^@#!~";
$lang3 = "dasda$RWERs636 da<b>asd_45646asd<em>";
Чтобы очистить их, я написал эту простую функцию
function clean($s = '')
{
$c = mb_strtolower((trim($s)), 'UTF-8');
$c = preg_replace ( '/[^0-9\p{Cyrillic}\p{Ll}\w]/u', '', $c);
$c = htmlentities(strip_tags($c), ENT_QUOTES, 'UTF-8');
return $c;
}
который возвращает то, что мне нужно;
şğğş4334şğ_ğüğsdçabb
еукд363левалджыу_жлаывфemвфы34234emвфывф
dasdadabasd_45646asdem
Второй случай: разрешены только английские символы, недопустимые символы и другие символы UTF-8 должны быть удалены. (это для очистки ввода электронной почты пользователем)
входы:
$email1 = "dasda @:;/<ŞĞğ ВАЛДЖЫуda<b>asd_45646asd<em>.com";
$email2 = "^%(#*$#)$&(237469879şşşdsasadsdasd/||\><? ВАЛДЖЫуda<b>asd_45646asd<em> .com";
$email3 = "t est i @coЬm.tr";
$email4 = "&/(/&^+'!+!^+<em>[email protected]()( РЛОкуц <em> ";
$email5 = "++ ?ЕНГКУ teЛОДКУst@mail.уцкru...";
$email6 = " ?ЕНГКУ teЛОДКУst@.уцкua";
$email7 = " ++ [email protected]++";
Поскольку эта часть предназначена для электронных писем и должна принимать только английские символы, я написал следующие функции для очистки и проверки;
function clean_email($s = '')
{
$c = mb_strtolower((trim($s)), 'UTF-8');
$c = filter_var(strip_tags($c), FILTER_SANITIZE_EMAIL);
$c = preg_replace ('/(?i)[^a-z\.@_\-\+\d]|[.@]{2,}/u', '', $c);
$c = preg_replace ( '/^[+.-@]{1,}|[+.-@]{1,}$/u', '', $c);
return $c;
}
function valid ($v = '')
{
if (filter_var($v, FILTER_VALIDATE_EMAIL) == TRUE) {return 'valid';} else {return 'false';}
}
при вызове через:
echo clean_email($email1).' : '.valid(clean_email($email1)).'<br/>';
возвращает то, что мне нужно
dasda : false
dsasadsdasd : false
[email protected] : valid
[email protected] : valid
[email protected] : valid
testua : false
[email protected] : valid
п.с.
- Мне не нужно полное соответствие UTF-8/RFC в этом поле ввода электронной почты, а также мне не нужно включать все возможные специальные символы, которые могут быть включены в электронное письмо. Я предпочитаю быть более строгим и указывать в начальном вопросе, что нужно, а также что делает функция. Идея здесь больше в том, чтобы избавиться от опечаток, чем в проверке электронной почты, на онлайн-сайте я бы предпочел ничего не исправлять, а просто выдать ошибку.
— обновлено регулярное выражение в функции очистки электронной почты, чтобы включить символы + и —.