最可靠的是filter_var()配合FILTER_VALIDATE_IP和FILTER_FLAG_IPV4,因ip2long()不校验格式,会错误接受"127.0.0.256"或"127.0.0.1abc";filter_var()需同时指定两个参数,否则可能误判IPv6或返回恒false。

直接用 filter_var() 配合 FILTER_VALIDATE_IP 和 FILTER_FLAG_IPV4 最可靠,别手写正则或用 ip2long() 判定。
为什么不用 ip2long() 判断 IPv4?
ip2long() 会把形如 "127.0.0.1" 转成整数,但也会接受 "127.0.0.256"(溢出后回绕)或 "127.0.0.1abc"(截断前缀),返回非 false 值,导致误判。
- 它只做转换,不校验格式合法性
- 对带空格、多余点、超范围段(如
256)无严格拦截 -
ip2long("127.0.0.1 ") === false是因为尾部空格,但ip2long("127.0.0.1abc") !== false却成立
filter_var() 的正确用法和常见陷阱
必须同时指定 FILTER_VALIDATE_IP 和 FILTER_FLAG_IPV4,否则默认允许 IPv4 或 IPv6 任一匹配。
- ✅ 正确:
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) - ❌ 错误:
filter_var($ip, FILTER_VALIDATE_IP)—— 会把"::1"也当合法 - ❌ 错误:
filter_var($ip, FILTER_FLAG_IPV4)—— 缺少过滤器常量,返回false恒成立 - 空字符串、
null、含换行符的字符串均返回false,符合预期
示例:
立即学习“PHP免费学习笔记(深入)”;
var_dump(filter_var("192.168.1.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); // string(11) "192.168.1.1"
var_dump(filter_var("192.168.1.256", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); // bool(false)
var_dump(filter_var("192.168.1", FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); // bool(false)
需要兼容老旧 PHP 版本(
PHP 5.2.0 才引入 FILTER_FLAG_IPV4,低于该版本只能靠正则,但必须严格限制每段为 0–255 且无前导零(除非单个 0)。
- 推荐用:
/^((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]?)$/ - 别用简单
/^\d{1,3}(\.\d{1,3}){3}$/—— 它会放过999.999.999.999 - 注意:正则无法处理 Unicode 空格、全角点等边缘情况,
filter_var()内部做了 trim 和编码预处理
真正容易被忽略的是:即使用了 filter_var(),也要注意变量类型。传入整数 123 或布尔值 true 会静默转成字符串再校验,结果可能不符合直觉——比如 filter_var(true, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) 返回 "1",而 "1" 不是合法 IPv4。务必确保输入是字符串,必要时加 (string) 强制转换。











