Challenge Complete!!
I created a class rather than a single function.
I thought that it might be useful for some people to work in binary? So i added a flag to turn on binary comparison.
Code includes examples.
Code: Select all
<?php
#php subnet validator
class isValidIPv4Mask{
public function __Construct(){}
public function checkSubnet($mask,$isBin=false){
if(!$this->checkChallengeMask($mask,$isBin)){
return false;
}
$segments = explode('.',$mask);
if(!$isBin){
return $this->checkValidity($this->convertToBin($segments));
}
return $this->checkValidity($segments);
}
private function convertToBin($segments){
foreach($segments as $decimal){
$binArr[] = decbin($decimal);
}
return $binArr;
}
private function checkChallengeMask($mask,$isBin=false){
if(!$isBin){
if(preg_match('/(0|255)\.(0|255)\.(0|255)\.(0|255)/',$mask)){ // check if mask is either 0.0.0.0 or 255.255.255.255
return false;
}
}else{
if(preg_match('/(0{8}|1{8})\.(0{8}|1{8})\.(0{8}|1{8})\.(0{8}|1{8})/',$mask)){// check if mask (in binary) is either 0.0.0.0 or 255.255.255.255
return false;
}
}
return true;
}
private function checkValidity($checkArr){
$binStr = implode($checkArr);
$regexFalse = array('/^0/','/(0+)(1+)(0+)/','/(1+)(0+)(1+)/');
foreach($regexFalse as $regex){
if(preg_match($regex,$binStr)){
return false;
}
}
if(preg_match('/^(1+)(0+)/',$binStr)){
return true;
}
return false;
}
};
$subnetValidator = new isValidIPv4Mask();
$subArr = array("255.255.255.254","255.128.255.128","255.63.0.255","255.128.0.256","0.0.0.0","255.255.255.255");
$binArr = array("11111111.11111111.11111111.11111111","00000000.00000000.00000000.00000000","01111111.11111111.11111111.11111111","11111111.10000000.10000000.11111110","01111111.11111111.11111111.11111110","11111111.11111111.11111111.10000000","11111111.11111111.11111111.11111111");
foreach($subArr as $sub){
if($subnetValidator->checkSubnet($sub)){
print "Subnet: {$sub} - True<br/>";
}else{
print "Subnet: {$sub} - False<br/>";
}
}
print "-----------------------------------------------------------------<br/>";
foreach($binArr as $sub){
if($subnetValidator->checkSubnet($sub,true)){
print "Bin Subnet: {$sub} - True<br/>";
}else{
print "Bin Subnet: {$sub} - False<br/>";
}
}
?>
Output:
Code: Select all
Subnet: 255.255.255.254 - True
Subnet: 255.128.255.128 - False
Subnet: 255.63.0.255 - False
Subnet: 255.128.0.256 - False
Subnet: 0.0.0.0 - False
Subnet: 255.255.255.255 - False
-----------------------------------------------------------------
Bin Subnet: 11111111.11111111.11111111.11111111 - False
Bin Subnet: 00000000.00000000.00000000.00000000 - False
Bin Subnet: 01111111.11111111.11111111.11111111 - False
Bin Subnet: 11111111.10000000.10000000.11111110 - False
Bin Subnet: 01111111.11111111.11111111.11111110 - False
Bin Subnet: 11111111.11111111.11111111.10000000 - True
Bin Subnet: 11111111.11111111.11111111.11111111 - False
EDIT::
Updated to correctly reflect valid subnets XD