如何在PHP中验证IPv4与IPv6地址?无法使用filter_var函数
用正则实现IPv4/IPv6验证(替代filter_var)
没问题,既然你的环境没法用filter_var,用正则表达式来实现这两个IP验证函数完全可行!我给你整理了两个经过测试的函数,直接就能嵌入你的代码逻辑里:
1. IPv4 验证函数
IPv4的结构是4个0-255的十进制数,用点分隔。正则需要确保每个段都在合法范围内(比如不能是256,也不能是012这种带前导零的非法格式)。
function is_valid_ipv4($ip) { // 匹配IPv4格式:四个0-255的段,无前置零(除非是单个0) $pattern = '/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/'; return preg_match($pattern, $ip) === 1; }
2. IPv6 验证函数
IPv6的情况要复杂一些,它是8组16进制数,支持用::压缩连续的零段。下面的正则会覆盖标准格式、压缩格式,还有混合IPv4的过渡格式(比如::ffff:192.168.1.1这种):
function is_valid_ipv6($ip) { // 匹配IPv6的各种合法格式,包括压缩段和IPv4混合格式 $pattern = '/^(?:(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,7}:|(?:[0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|(?:[0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|(?:[0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|(?:[0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|(?:[0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/'; return preg_match($pattern, $ip) === 1; }
你的逻辑实现示例
现在你可以直接按照你想要的逻辑来使用这两个函数了:
$ip = $_SERVER['REMOTE_ADDR']; // 替换成你要验证的目标IP地址 if (is_valid_ipv4($ip)) { echo "这是一个合法的IPv4地址"; // 这里写你的IPv4专属处理逻辑 } else if (is_valid_ipv6($ip)) { echo "这是一个合法的IPv6地址"; // 这里写你的IPv6专属处理逻辑 } else { echo "这不是一个合法的IP地址"; // 这里写非法IP的处理逻辑 }
小提示
- IPv4的正则已经排除了前导零的非法格式(比如
192.168.01.1会被判定为无效,符合IP规范) - IPv6的正则覆盖了绝大多数实际场景,包括本地环回地址
::1、链路本地地址,还有IPv4过渡地址,兼容性拉满
内容的提问来源于stack exchange,提问作者Lex Podgorny
相关产品推荐
相关产品推荐

