干净的用户提交了意外或故意垃圾的输入。我写了以下内容来做到这一点,并且有兴趣看到针对同一问题的更有效或更好的解决方案。
注意:我在 mysql 方面使用了mysqli 准备好的语句。
第一种情况: 用户应该能够输入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>test@com.kz()( РЛОкуц <em> ";
$email5 = "++ ?ЕНГКУ teЛОДКУst@mail.уцкru...";
$email6 = " ?ЕНГКУ teЛОДКУst@.уцкua";
$email7 = " ++ fake.some--one+tag@gmail.com++";
由于这部分是用于电子邮件的,并且应该只接受英文字符,所以我编写了以下函数来清理和验证;
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
testi@com.tr : valid
test@com.kz : valid
test@mail.ru : valid
testua : false
fake.some--one+tag@gmail.com : valid
ps
- 我不需要在此电子邮件输入字段中完全符合 UTF-8 / RFC,也不需要包含所有可能包含在电子邮件中的特殊字符。我更喜欢限制更多,并在最初的问题中说明需要什么以及函数的作用。这里的想法更多的是摆脱错误输入的字符而不是验证电子邮件,在一个在线站点中,我宁愿不更正任何东西,而只是抛出一个错误。
- 更新了干净电子邮件功能中的正则表达式以包含 + 和 - 字符。