本文目录导读:

在 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),可以扩展函数以提取前三个八位字节进行匹配。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播