Php 不完整的IP地址和ip2long()

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.

我突然提出以下问题:

“以下代码的输出是什么?”

正确答案是:“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.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