如何在PHP中检查一个IP地址是否在两个IP地址范围内?

65

我有一个IP地址,另外还有两个IP地址,它们共同构成了一个IP范围。我想检查第一个IP地址是否在这个范围内。在PHP中,我该如何找出答案?


9
+1 表示顶起此问题,使其得以回到0分。我不明白为什么它会被踩。 - Hubro
4
由于缺乏研究努力。 - CodeCaster
2
你怎么知道在提问之前进行了多少研究?对我来说,你对这个问题的问题是它太简短了。但在他更好地定义“范围”之前,我将取消我的点赞。 - Hubro
3
我是女性,好的范围是在从abc.def.ghi.jkl到mno.pqr.stu.vwx之间。 - guitarlass
2
我昨天大部分时间都在寻找关于“范围”、“缩放”、“图表”的一些具体答案……看看你能找到什么,告诉我有多少描述了highcharts的默认设置。当你不知道答案时,在谷歌中使用正确的术语可能是一项非常枯燥无味的任务。我至少花费了2个小时搜索,然后才会提问,通常会得到带有正确“关键词”的答案,然后可以梦想中获得关于该主题的每一个具体答案。 - GDP
显示剩余6条评论
11个回答

-1

我为我的客户使用了这个:

$clientIpArray = explode(".", $clientIp);
$fromArray = explode(".", $from);
$toArray = explode(".", $to);
        
if( ((str_pad($clientIpArray[0], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[0], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[0], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[0], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[1], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[1], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[1], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[1], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[2], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[2], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[2], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[2], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[3], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[3], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[3], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[3], 3, "0", STR_PAD_LEFT)))){
  echo "IP within range";
}

例如,让我们来看这个例子:
$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";

正如您所理解的,此IP地址在范围内。如果您尝试按原样进行比较,它将无法工作。 我的解决方案是将IP地址分成元素,例如生成的数组将是:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];

我们有4个元素要比较,这里我使用了str_pad函数从每个元素生成一个3个字符的字符串,因此我们不再检查“3”是否在“1”和“20”之间(这是错误的),而是检查“003”是否在“001”和“020”之间(这是正确的)。

利用 intval() 函数使用简单的比较运算符。你不必坚持使用字符串。简单的数字比较也会使代码更易读。 - Peter Krebs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接