Php 不完整的IP地址和ip2long()
我突然提出以下问题: “以下代码的输出是什么?” 正确答案是:“127.0.255.0” 虽然在中提到这种行为似乎是合乎逻辑的,在中甚至有一个例子,但我的问题是复制它 我的代码生成以下输出:Php 不完整的IP地址和ip2long(),php,Php,我突然提出以下问题: “以下代码的输出是什么?” 正确答案是:“127.0.255.0” 虽然在中提到这种行为似乎是合乎逻辑的,在中甚至有一个例子,但我的问题是复制它 我的代码生成以下输出: echo ip2long("127.0.255"); // outputs: FALSE echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0 我测试的机器有以下软件版本: PHP 5.3.3-7+Suhosin补丁挤压15 苏霍辛贴片0.9.9.
echo ip2long("127.0.255"); // outputs: FALSE
echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0
我测试的机器有以下软件版本:
- PHP 5.3.3-7+Suhosin补丁挤压15
- 苏霍辛贴片0.9.9.1
如果您有任何解释,请告诉我。PHP手册还规定(): 变更日志 版本说明 5.2.10在此版本之前,ip2long()有时会返回有效数字,即使传递的值不是(IPv4)Internet协议点地址 因此,当您使用比5.2.9更新的版本时,它不再工作了
更新:但它可能在某些系统上工作,因为依赖ip2long函数的inet_addr C函数不是C标准的一部分:每个系统可能都有自己的实现。其中一些实现具有无效IP地址的回退模式。您不应该依赖于此,因为大多数unix衍生产品没有这样的回退。如果您使用
ip2long
进行IP验证,我建议使用filter\u var($IP,filter\u VALIDATE\u IP
)
我已经查找了ip2long的PHP源代码 如果inet\u pton可用,则使用inet\u pton。否则使用inet\u addr inet\u pton检查ip是否具有ddd.ddd.ddd.ddd格式,否则返回0。
如果使用inet_addr,则ip中缺少的部分将用0填充。我不运行Suhosin,我的输出与您相同-
0.0.0
。版本为PHP5.4.14
。ip2long也可以进行验证,您只需检查!==false…(尽管这不是推荐的方法)实际上,我不想使用此代码进行验证,这只是我学习材料中的一个问题。@bwoebi除了5.2.10之前的ip2long可以验证无效的IP之外,正如您在回答中所示-false===ip2long('1.2.3')
将在5.2.10之前验证为正确的IP是的,我读过这篇文章。但描述仍然提到:“ip2long()也适用于不完整的IP地址。“@tobyte这是一个依赖于系统的实现;不要依赖于此。看起来是这样。但是这个问题没有一个特定的答案,我的学习材料中的答案是错误的。@tobyte在任何unix中,我刚刚测试过这个,它都不起作用……可能在Windows上起作用。我可以确认这一点。我已经在debian、centos和osx上测试过它。
echo ip2long("127.0.255"); // outputs: FALSE
echo long2ip(ip2long("127.0.255")); //outputs: 0.0.0.0