Yii2中需在模型层校验MAC地址合法性,包括格式匹配、长度检查、十六进制有效性、非多播、非全零等;规则含trim、required、match正则及自定义validateMacAddress方法。

在Yii2项目中对用户提交的MAC地址做合法性校验,避免非法字符串进入数据库或触发错误绑定逻辑,必须在模型层就拦截格式错误、非法字符、广播地址等典型问题。
在Model中添加MAC地址验证规则
打开对应模型文件(如PetForm.php),在rules()方法中加入MAC专用校验项:
['mac', 'filter', 'filter' => 'trim'],
['mac', 'required', 'message' => 'MAC地址不能为空'],
['mac', 'match', 'pattern' => '/^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$/u', 'message' => 'MAC地址格式不正确,请使用类似 00:1A:2B:3C:4D:5E 或 00-1A-2B-3C-4D-5E 的格式'],
['mac', 'validateMacAddress']
注意:正则必须用/u修饰符支持Unicode,否则中文输入法残留全角字符会导致匹配失败;【pattern必须严格限定为6组两位十六进制+5个分隔符】,不能省略起始^和结尾$,否则'00:1A:2B:3C:4D:5E:extra'也会通过。
编写自定义验证方法 validateMacAddress
在模型类中新增一个公共方法:
public function validateMacAddress($attribute, $params)
{
$mac = $this->$attribute;
if (empty($mac)) {
return;
}
// 去除所有分隔符,只留12位十六进制字符
$clean = preg_replace('/[:-]/', '', $mac);
if (strlen($clean) !== 12) {
$this->addError($attribute, 'MAC地址长度异常,请检查是否有多余字符');
return;
}
// 逐段转为十进制,检测是否超出0–255范围
for ($i = 0; $i $seg = substr($clean, $i * 2, 2);
$val = hexdec($seg);
if ($val 255) {
$this->addError($attribute, "第".($i+1)."段 '$seg' 不是合法十六进制值");
return;
}
}
// 检查是否为多播地址(第一字节最低位为1)
$firstByte = hexdec(substr($clean, 0, 2));
if (($firstByte & 1) === 1) {
$this->addError($attribute, '不支持多播MAC地址');
return;
}
// 检查是否为全零地址
if ($clean === '000000000000') {
$this->addError($attribute, 'MAC地址不能为全零');
return;
}
}
控制器中调用验证
在接收请求的Action里,直接调用$model->validate()即可触发全部规则,包括自定义的validateMacAddress:
$model = new PetForm();
$model->load(Yii::$app->request->get(), '');
if (!$model->validate()) {
return $this->asJson(['code' => 400, 'msg' => '参数错误', 'errors' => $model->getErrors()]);
}
// 验证通过后执行绑定逻辑


















