最可靠的是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,符合预期示例:
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 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
filter_var() 内部做了 trim 和编码预处理真正容易被忽略的是:即使用了 filter_var(),也要注意变量类型。传入整数 123 或布尔值 true 会静默转成

filter_var(true, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) 返回 "1",而 "1" 不是合法 IPv4。务必确保输入是字符串,必要时加 (string) 强制转换。