You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:35