將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>
用法
用法<code class="php">$ips = ['10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4'];</code>
<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
以上是如何使用內建函數確定 IP 位址是否在 CIDR 子網路內?的詳細內容。更多資訊請關注PHP中文網其他相關文章!