有时使用PHP函数可能会令人惊讶。使用验证过滤器验证IP地址似乎是其中之一。您可以设置几个标志来指定您不认为哪种IP地址有效,即:
- FILTER_FLAG_IPV4:仅验证IPv4地址
- FILTER_FLAG_IPV6:仅验证IPv6地址
- FILTER_FLAG_NO_PRIV_RANGE:将私有范围内的IP视为无效
- FILTER_FLAG_NO_RES_RANGE:将保留范围内的IP视为无效
在PHP文档中,这些标志的说明如下:
验证值是否为IP地址,可以是仅IPv4或IPv6,也可以不是私有或保留范围中的值。
嗯是的 好了,为了清楚说明它是如何工作的,下面是一些示例(第一个令人惊讶的示例):
$ ip =“ 2001:db8:0:8d3:0:8a2e:70:7344”;
$ flags = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
filter_var($ ip,FILTER_VALIDATE_IP,$ flags);
=>错误
$ ip =“ 30.17.132.147”;
$ flags = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6;
filter_var($ ip,FILTER_VALIDATE_IP,$ flags);
=>错误
如果FILTER_FLAG_IPV4
和FILTER_FLAG_IPV6
一起指定,FILTER_VALIDATE_IP
似乎总是返回false
,这对我来说是出乎意料的。其余的都是可以理解的:
$ ip =“ 2001:db8:0:8d3:0:8a2e:70:7344”;
filter_var($ ip,FILTER_VALIDATE_IP);
=>“ 2001:db8:0:8d3:0:8a2e:70:7344”
$ ip =“ 30.17.132.147”;
filter_var($ ip,FILTER_VALIDATE_IP);
=>“ 30.17.132.147”
这些都FILTER_VALIDATE_IP
默认验证为同时允许IPv4和IPv6。
有关专用范围和保留范围标志的作用的说明,请查看Wikipedia页面上的保留IP地址。