2424
2525class CIDR
2626{
27+ /**
28+ * Normalize ip6 address
29+ *
30+ * @param string $ip ip address
31+ * @return string|null normalized ip address
32+ */
2733 public static function normalizeIp6 (string $ ip ) :?string
2834 {
2935 if (!str_contains ($ ip , ': ' )) {
@@ -35,6 +41,12 @@ public static function normalizeIp6(string $ip) :?string
3541 return implode (': ' , str_split (bin2hex ($ bin ), 4 ));
3642 }
3743
44+ /**
45+ * Normalize ip4 address
46+ *
47+ * @param string $arg ip address
48+ * @return string|null normalized ip address
49+ */
3850 public static function normalizeIp4 (string $ arg ): ?string
3951 {
4052 $ arg = trim ($ arg );
@@ -66,6 +78,8 @@ public static function normalizeIp4(string $arg): ?string
6678 }
6779
6880 /**
81+ * Convert ip4 cidr to range
82+ *
6983 * @param string $cidr
7084 * @return ?array{0:string, 1:string}
7185 */
@@ -87,13 +101,21 @@ public static function ip4CidrToRange(string $cidr): ?array
87101 return null ;
88102 }
89103 $ range = (int ) $ range ;
90- return [
91- long2ip ((ip2long ($ ip )) & ((-1 << (32 - $ range )))),
92- long2ip ((ip2long ($ ip )) + pow (2 , (32 - $ range )) - 1 )
93- ];
104+ $ ipLong = ip2long ($ ip );
105+ if ($ ipLong === false ) {
106+ return null ;
107+ }
108+ $ first = long2ip (($ ipLong ) & ((-1 << (32 - $ range ))));
109+ $ last = long2ip (($ ipLong ) + pow (2 , (32 - $ range )) - 1 );
110+ if (!$ first || !$ last ) {
111+ return null ;
112+ }
113+ return [$ first , $ last ];
94114 }
95115
96116 /**
117+ * Convert ip6 cidr to range
118+ *
97119 * @param string $cidr
98120 * @return ?array{0:string, 1:string}
99121 */
@@ -145,17 +167,24 @@ public static function ip6cidrToRange(string $cidr) : ?array
145167 }
146168
147169 /**
170+ * Convert cidr to range
171+ *
148172 * @param string $cidr
149173 * @return ?array{0:string, 1:string}
150174 */
151175 public static function cidrToRange (string $ cidr ) : ?array
152176 {
153- if (str_contains ($ cidr , ': ' )) {
154- return self ::ip6cidrToRange ($ cidr );
155- }
156- return self ::ip4cidrToRange ($ cidr );
177+ return str_contains ($ cidr , ': ' )
178+ ? self ::ip6CidrToRange ($ cidr )
179+ : self ::ip4CidrToRange ($ cidr );
157180 }
158181
182+ /**
183+ * Normalize ip address
184+ *
185+ * @param string $ip
186+ * @return string|null
187+ */
159188 public static function normalize (string $ ip ): ?string
160189 {
161190 $ ip = trim ($ ip );
@@ -168,32 +197,52 @@ public static function normalize(string $ip): ?string
168197 return self ::normalizeIp4 ($ ip );
169198 }
170199
200+ /**
201+ * Filter ip6 address
202+ *
203+ * @param string $ip
204+ * @return string|null
205+ */
171206 public static function filterIp6 (string $ ip ): ?string
172207 {
173208 $ ip = trim ($ ip );
174209 if ($ ip === '' || !str_contains ($ ip , ': ' )) {
175210 return null ;
176211 }
177212 $ bin = inet_pton ($ ip );
178- return $ bin !== false ? inet_ntop ($ bin ) : null ;
213+ return $ bin !== false ? ( inet_ntop ($ bin)?: null ) : null ;
179214 }
180215
216+ /**
217+ * Filter ip4 address
218+ *
219+ * @param string $ip
220+ * @return string|null
221+ */
181222 public static function filterIp4 (string $ ip ): ?string
182223 {
183224 $ ip = trim ($ ip );
184225 if ($ ip === '' || !str_contains ($ ip , '. ' )) {
185226 return null ;
186227 }
187228 $ bin = ip2long ($ ip );
188- return $ bin !== false ? long2ip ($ bin ) : null ;
229+ return $ bin !== false ? ( long2ip ($ bin)?: null ) : null ;
189230 }
190231
232+ /**
233+ * Filter ip address
234+ *
235+ * @param string $ip
236+ * @return string|null
237+ */
191238 public static function filter (string $ ip ): ?string
192239 {
193240 return self ::filterIp6 ($ ip )??self ::filterIp4 ($ ip );
194241 }
195242
196243 /**
244+ * Check if ip is in range
245+ *
197246 * @param string $ip
198247 * @param string $startIP
199248 * @param string $endIP
@@ -208,6 +257,8 @@ public static function inRange(string $ip, string $startIP, string $endIP): bool
208257 }
209258
210259 /**
260+ * Check if ip is in range cidr
261+ *
211262 * @param string $ip
212263 * @param string $cidr
213264 * @return bool
@@ -218,7 +269,6 @@ public static function inRangeCidr(string $ip, string $cidr): bool
218269 if (!$ cidr ) {
219270 return false ;
220271 }
221-
222272 return self ::inRange ($ ip , $ cidr [0 ], $ cidr [1 ]);
223273 }
224274}
0 commit comments