隨者機器越來越多,將單一IP以字串方式檢測的方式,當網路臨時調整時、或者要檢測的IP數很多時,就有點麻煩了。使用判斷網段的方式,會比較有彈性。 依照tcp/ip的邏輯,利用位元運算先做出了第一版 function matchCIDR( $ip , $cidr ) { list( $ip , $mask ) = explode ( '/' , $cidr ); $mask =(32 - $mask ); return (( ip2long ( $ip ) >> $mask ) == ( ip2long ( $ip ) >> $mask )); } 想說,是否有更快、更好的的作法?在 PHP: ip2long - Manual 看到了兩個作法。一個作法,很有效率。另一個卻比較差。 下面這個PHP程式碼,根據實際測試的結果,速度是最快的。不過…程式碼的可讀性比較差,需要想一下才能瞭解其邏輯。 function netMatch( $IP , $CIDR ) { list ( $net , $mask ) = explode ( '/' , $CIDR ); return ( ip2long ( $IP ) & ~((1 << (32 - $mask )) - 1) ) == ip2long ( $net ); }