如何用PHP验证后缀为.ac.uk的学校邮箱域名?
PHP 校验.ac.uk后缀学校邮箱方案
原代码存在的问题
- 变量名不一致:前面将提交的邮箱存入
$uemail,后续正则校验误用了未定义的$email,会触发逻辑错误 - 正则规则不严谨:正则中的
.未转义,会匹配任意字符,同时没有避免后缀出现在用户名部分的问题(比如testac.uk@qq.com会被误判为符合要求) - 逻辑结构不完整:缺少分支闭合,合法邮箱没有对应的处理逻辑
修复后的校验代码
兼容低PHP版本的正则版本
$emailErr2 = $emailErr3 = ''; $uemail = ''; if (empty($_POST["uni_email"])) { $emailErr2 = "University email is required"; } else { $uemail = trim($_POST["uni_email"]); // 先校验基础邮箱格式 if (!filter_var($uemail, FILTER_VALIDATE_EMAIL)) { $emailErr3 = "Invalid email format"; echo $emailErr3; } else { // 拆分出域名部分校验后缀 $email_domain = substr(strrchr($uemail, "@"), 1); // 正则校验域名以.ac.uk结尾,转义.避免匹配任意字符,i修饰符忽略大小写 if (!preg_match('/\.ac\.uk$/i', $email_domain)) { $emailErr3 = "Invalid university email format, must end with .ac.uk"; echo $emailErr3; } else { // 邮箱校验通过的后续逻辑 echo "邮箱校验合法"; } } }
PHP 8.0+ 更高效的版本
用内置的str_ends_with函数替代正则,性能更高也避免正则编写失误的问题:
// 前面基础校验逻辑不变,后缀校验替换为: if (!str_ends_with(strtolower($email_domain), '.ac.uk')) { $emailErr3 = "Invalid university email format, must end with .ac.uk"; echo $emailErr3; }
checkdnsrr函数的适用说明
这个函数完全可以用在该场景做增强校验,不需要校验.ac.uk本身,而是校验拆分出来的完整邮箱域名(比如示例的email.ac.uk)是否存在MX邮件交换记录:
// 后缀校验通过后加一层MX记录校验 if (!checkdnsrr($email_domain, 'MX')) { $emailErr3 = "该邮箱域名不存在,无法接收邮件"; echo $emailErr3; }
这层校验可以过滤掉用户编造的、实际不存在的.ac.uk后缀域名,进一步提升校验的有效性。
内容的提问来源于stack exchange,提问作者bola Oyetade
相关产品推荐
相关产品推荐

