[英]How can I simplify an IP address using PHP? Trying long2ip(ip2long(address))
我的系统包括一个第三方框,用于存储IP地址并将其与从我的Web界面发送的值进行比较。 我有一个问题,用户输入第三方框的网络掩码为255.255.255.000,并且该框将其存储为255.255.255.0。 但是,下次该框重新启动并被告知掩码包含000时,它得出以下结论:这些值不同,并更新其数据库并重新启动。 并重新启动。 并重新启动。
我的目的是通过将网络掩码以简化形式255.255.255.0存储在我自己的系统中(并作为另一个示例将010.001.002.005存储为10.1.2.5)来解决此问题。 但是我是PHP的新手。 我尝试使用代码$mask = long2ip(ip2long($mask))
将条目转换为标准化形式,但刚刚返回0.0.0.0。 我需要做些特殊的事情来将IP转换为长时转换吗? 有没有更好的方法可以简化此过程?
ip2long
在发生错误时返回false,并且似乎没有检测到000为有效。 由于未将255.255.255.000
检测为有效IP,因此它将返回false,因此long2ip(false)
不会吐出有效IP。
您甚至可以在接受IP地址之前检查ip2long(input)
返回true。 进行适当的验证将防止无效的IP破坏系统。 试图对所有可能的无效IP地址实施自动校正要比仅仅强制执行一个有效IP困难得多。
要遵循@ka_lin在评论中的建议,只需将其分解为多个部分,将其转换为将删除前导0的int并进行爆破重建即可。
$mask = implode(".", array_map("intval", explode(".", $mask)));
一个简单且开销较小的版本假定IP地址由4部分组成...
list ($o1, $o2, $o3, $o4) = explode(".", $mask);
$mask = (int)$o1.".".(int)$o2.".".(int)$o3.".".(int)$o4;
很难做到,因为010.001.002.005是有效的IP地址,但也可能造成混淆(有时以0开头的数字是八进制的)。
注意: ip2long()
有一个问题:它不接受有效的IP地址127.1
(经典的表示法,但是有效!)或127.0.0.010
(RFC表示无效,但大多数将010
作为八进制数读取)。
替代方法gethostbyname()
。 但是gethostbyname()
也存在问题:如果输入了无效的ip(如127.0.0.1234
),则它将进行DNS查找,如果查找失败,则返回源。
解决方案可以是:
long2ip(ip2long(gethostbyname($IP_ADDRESS)))
我的个人解决方案是以下功能:
function aton ( $addr )
{
$l = explode('.',$addr);
switch (count($l))
{
case 0: return FALSE;
case 1: return intval($l[0]) & 0xffffffff;
case 2: return ( intval($l[0]) << 24
| intval($l[1])
) & 0xffffffff;
case 3: return ( intval($l[0]) << 24
| intval($l[1]) << 16
| intval($l[2])
) & 0xffffffff;
default: return ( intval($l[0]) << 24
| intval($l[1]) << 16
| intval($l[2]) << 8
| intval($l[3])
) & 0xffffffff;
}
}
通过此功能,您可以使用:
long2ip(aton($IP_ADDRESS))
顺便说一句,我从来没有问题,如255.255.255.0
特殊IP地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.