将 IP 地址与 CIDR 子网匹配
确定 IP 地址是否属于特定 CIDR 子网是网络管理中的一项常见任务。它允许有效映射和管理 IP 范围。
为了满足这一需求,让我们探索函数 cidr_match() 的实现,该函数仅使用内置函数或常用函数执行此匹配。
实现概述
该算法涉及使用 ip2long() 函数将 IP 地址和子网范围转换为长整数。接下来,通过将子网范围的尾随数字(例如“/16”)转换为按位掩码来获得子网掩码。该掩码有效地将 IP 地址拆分为网络前缀和主机后缀。
最后,我们在 IP 地址和子网掩码之间执行按位 AND 运算。如果结果与子网范围匹配,则 IP 地址在指定的 CIDR 子网内。
函数定义
以下是 cidr_match() 函数的实现:
<code class="php">function cidr_match($ip, $range) { list ($subnet, $bits) = explode('/', $range); if ($bits === null) { $bits = 32; } $ip = ip2long($ip); $subnet = ip2long($subnet); $mask = -1 << (32 - $bits); $subnet &= $mask; // Ensure subnet is aligned return ($ip & $mask) == $subnet; }</code>
用法示例
在提供的示例中,假设我们有一个 IP 地址数组要检查:
<code class="php">$ips = ['10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4'];</code>
我们想要验证哪些 IP 属于子网“10.2.0.0/16”:
<code class="php">foreach ($ips as $IP) { if (cidr_match($IP, '10.2.0.0/16') == true) { print "{$IP} is in the 10.2 subnet\n"; } }</code>
输出:
10.2.1.100 is in the 10.2 subnet 10.2.1.101 is in the 10.2 subnet
这演示了 cidr_match() 函数的用法确定 IP 地址是否属于指定的 CIDR 子网。
以上是如何使用内置函数确定 IP 地址是否在 CIDR 子网内?的详细内容。更多信息请关注PHP中文网其他相关文章!