本文目录导读:

在 PHP 中校验 MAC 地址(48位硬件地址)格式,通常有几种常见的方法,具体取决于你允许的格式(分隔符、大小写等)。
标准 MAC 地址格式校验
标准的 MAC 地址是 6 组两位十六进制数,用冒号或连字符分隔。
function validateMacAddress($mac) {
// 允许的格式: XX:XX:XX:XX:XX:XX 或 XX-XX-XX-XX-XX-XX
// 不区分大小写,允许大写或小写字母
$pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/';
return preg_match($pattern, $mac) === 1;
}
// 测试
var_dump(validateMacAddress('00:1A:2B:3C:4D:5E')); // true
var_dump(validateMacAddress('00-1A-2B-3C-4D-5E')); // true
var_dump(validateMacAddress('00:1A:2B:3C:4D:5G')); // false (G不是十六进制字符)
var_dump(validateMacAddress('00:1A:2B:3C:4D')); // false (长度不足)
允许没有分隔符的格式
如果你需要支持没有分隔符的格式(如 001A2B3C4D5E):
function validateMacAddressFlexible($mac) {
// 支持带分隔符(冒号或连字符)或不带分隔符的格式
$pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^[0-9A-Fa-f]{12}$/';
return preg_match($pattern, $mac) === 1;
}
// 测试
var_dump(validateMacAddressFlexible('001A2B3C4D5E')); // true
var_dump(validateMacAddressFlexible('00:1A:2B:3C:4D:5E')); // true
分隔符可以混合或不一致
如果你需要支持各种分隔符混合使用的情况:
function validateMacAddressStrict($mac) {
// 只允许统一使用冒号或统一使用连字符
$pattern = '/^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$|^([0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}$/';
return preg_match($pattern, $mac) === 1;
}
// 测试
var_dump(validateMacAddressStrict('00:1A:2B:3C:4D:5E')); // true
var_dump(validateMacAddressStrict('00-1A-2B-3C-4D-5E')); // true
var_dump(validateMacAddressStrict('00:1A-2B-3C-4D-5E')); // false (混合分隔符)
使用 filter_var() 方法(PHP 5.2+)
PHP 的 filter_var() 对 MAC 地址的支持并不完美,它只验证格式,不验证是否为有效的十六进制字符。
function validateMacWithFilter($mac) {
// 注意: 这个函数不一定能正确验证所有MAC地址格式
// 不建议单独使用
return filter_var($mac, FILTER_VALIDATE_MAC) !== false;
}
完整的 MAC 验证函数(推荐)
这是一个功能完整的 MAC 地址验证函数:
function validateMacAddress($mac, $allowNoSeparator = false, $allowMixedCase = true) {
// 清理输入,去除两端空白
$mac = trim($mac);
// 检查是否为空
if (empty($mac)) {
return false;
}
// 基本模式:6组十六进制数
$hexPart = $allowMixedCase ? '[0-9A-Fa-f]' : '[0-9A-F]';
// 带分隔符的格式
$separatorPattern = '/^(' . $hexPart . '{2}[:-]){5}' . $hexPart . '{2}$/';
// 不带分隔符的格式
$noSeparatorPattern = '/^' . $hexPart . '{12}$/';
// 检查带分隔符格式
if (preg_match($separatorPattern, $mac)) {
return true;
}
// 如果需要,检查不带分隔符格式
if ($allowNoSeparator && preg_match($noSeparatorPattern, $mac)) {
return true;
}
return false;
}
// 使用示例
$macs = [
'00:1A:2B:3C:4D:5E',
'00-1A-2B-3C-4D-5E',
'001A2B3C4D5E',
'00:1A:2B:3C:4D:5G',
'invalid-mac'
];
foreach ($macs as $mac) {
$result = validateMacAddress($mac, true);
echo "$mac -> " . ($result ? "有效" : "无效") . "\n";
}
实时验证(比如在表单提交时)
// 用户输入验证
$userInput = $_POST['mac_address'] ?? '';
if (!validateMacAddress($userInput)) {
echo "错误:无效的 MAC 地址格式,请使用格式 XX:XX:XX:XX:XX:XX 或 XX-XX-XX-XX-XX-XX";
// 处理错误
} else {
echo "MAC 地址有效";
}
总结建议
- 生产环境推荐使用第5个方案 - 最完善且可配置
- 明确你的需求:是否需要支持无分隔符、是否区分大小写
- 注意安全:不要直接信任用户输入,总是先验证
- 性能:正则表达式验证非常高效,适合大量数据验证
如果需要更精确的控制(如验证特定厂商的 OUI),可以扩展函数以提取前三个八位字节进行匹配。