验证PHP中的IP地址

本文探讨了PHP中FILTER_VALIDATE_IP函数的使用,特别是当同时指定FILTER_FLAG_IPV4和FILTER_FLAG_IPV6标志时的行为。通过示例展示了函数在不同标志组合下的验证结果,揭示了可能的误解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时使用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_IPV4FILTER_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地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值