PHP ipcalc Class Demo by J L Kolpin

View this demo source.

Download Class: TGZ   ZIP


Sample Form


Simply enter any ip address within the subnet and the subnet mask | CIDR notation.

EXAMPLE1: 192.168.0.0 / 24

EXAMPLE2: 192.168.0.0 / 255.255.255.0

ADVANCED1: 192.168.0.0 / 255.255.255.0 255.255.192.0

ADVANCED2: 192.168.0.0 / 24 16

IP Address:   /  Subnet Mask|CIDR:   /  (Sub|Super)net Mask(optional): 
Show BitWise Output?: 


Class Output


Waiting for input.


ipcalc.class.php Source


<?
####################################################
## PHP IPCALC CLASS v0.0.1
####################################################
/*

Copyright  2010 Jason L Kolpin
Please send bug reports (or howdies) to bugs at mtfreetech adot us

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/
####################################################

####################################################
/*

RETURNS:
SUBNET/SUPERNET DATA FOR A GIVEN IP ADDRESS PLUS NETMASK

REQUIRES:
LINUX SERVER AND IPCALC INSTALLED AND IN $PATH OF WEBSERVER USER
PHP safe_mode OFF OR ipcalc IN EXECUTABLE PHP DIR

*/
####################################################
/*

THE CLASS ONLY HAS ONE REAL FUNCTION
getNetInfo USED AS DESCRIBED WILL VALIDATE YOUR INPUT
IF ONE OF THE INPUTS DOES NOT VALIDATE YOU WILL NOT KNOW WHICH ONE IT IS
THAT IS WHY I MADE THE VALIDATION FUNCTIONS PUBLIC
LOOK TO demo.php TO SEE AN EXAMPLE

USAGE

INCLUDE CLASS:
include('ipcalc.class.php');

INITIATE CLASS:
$myHandle = new ipcalc();

GET NET INFORMATION:

SIMPLE
$myHandle->getNetInfo($ip, $net);

EXTENDED
$myHandle->getNetInfo($ip, $net, $bit~optional, $snet~optional);

RETURNS: ARRAY CONTAINING LINES OF HTML OUTPUT

OPTIONALS:
$bit IS OPTIONAL AND SET OFF (0) BY DEFAULT
$snet IS OPTIONAL AND IS SET TO 0 BY DEFAULT

*/
####################################################
## THE FOLLOWING CAN BE USED TO VALIDATE THE INPUT
####################################################
/*

VALIDATE IP ADDRESS
$result = $myHandle->valIPAddr($ip);
RETURNS: INTEGER 0 (bad) | 1 (good)

VALIDATE BITWISE SELECTION
$result = $myHandle->valBit($bit);
RETURNS: INTEGER 0 (bad) | 1 (good)

VALIDATE SUBNET 1 ADDRESS
$result = $myHandle->valNET($NET);
RETURNS: INTEGER 0 (bad) | 1 (good)

VALIDATE SUB|SUPER-NET ADDRESS
$result = $myHandle->valSNET($net);
RETURNS: INTEGER 0 (bad) | 1 (good)

*/
####################################################

class ipcalc{

    
## THIS IS THE FUNCTION THAT GETS THE NETWORK INFO
    
public function getNetInfo($ip$net$bit=0$snet=0){
        
## IF EVERYTHING VALIDATES
        
if($this->valIPAddr($ip) == && $this->valNET($net) == && $this->valSNET($snet) == && $this->valBit($bit) == 1){
            
## CREATE THE COMMAND
            
$command 'ipcalc '.escapeshellcmd($ip).'/'.escapeshellcmd($net);
            
## TEST IF WE HAVE A SUPERNET
            
if($snet != 0){
                
$command $command.' '.escapeshellcmd($snet);
            }
            
## APPEND THE HTML OUTPUT SWITCH
            
$command $command.' -h';
            
## IF WE DO NOT WANT TO SEE BITWISE INFORMATION APPEND THE PROPER SWITCH
            
if($bit == 0){
                
$command $command.' -b';
            }
            
## EXECUTE THE COMMAND
            ## $output IS AN ARRAY HOLDING THE RETURN DATA
            
exec($command,$output);
            
## IF WE HAVE SOMETHING RETURN THE OUTPUT
            
if(!empty($output)){
                return 
$output;
            }else{
                return 
0;
            }
        }else{
            return 
0;
        }
    }
    
    
## VALIDATE IP ADDRESS
    
public function valIPAddr($ip){
        
## CHECK IF IT IS IN THE FORM OF AN IP ADDRESS
        #echo "pmatch:".preg_match('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/',$ip);
        
if(preg_match('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/',$ip)){
            
## SPLIT THE ADDRESS INTO AN ARRAY OF ITEMS
            
$chunks preg_split('/\./',$ip);
            foreach(
$chunks as $achunk){
                
## MAKE SURE IT IS WITHIN THE PROPER NUMERIC RANGE
                
if($achunk || $achunk >= 256 && preg_match('/\b\d{1,3}\b/',$achunk)){
                    
$bad 1;
                }
            }
            if(isset(
$bad)){
                return 
0;
            }else{
                return 
1;
            }
        }else{
            return 
0;
        }
    }
    
    
## VALIDATE BIT DATA
    
public function valBit($bit){
        
## IF IT MATCHES 0 OR 1
        
if(preg_match('/\b[0-1]{1,1}\b/',$bit)){
            return 
1;
        }else{
            return 
0;
        }
    }
    
    
## VALIDATE SUBNET DATA
    
public function valNET($net){
        
## MAKE SURE IT IS IN THE FORM OF AN IP ADDRESS
        
if(preg_match('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/',$net)){
            
## SPLIT THE ADDRESS INTO AN ARRAY OF ITEMS
            
$chunks preg_split('/\./',$net);
            
## AN ARRAY OF ACCEPTABLE NETMASK OCTETS
            
$netArr = array(0=>0,128=>128,192=>192,224=>224,240=>240,248=>248,252=>252,254=>254,255=>255);
            foreach(
$chunks as $achunk){
                
## MAKE SURE IT IS WITHIN THE PROPER NUMERIC RANGE
                
if($achunk || $achunk >= 256){
                    
$bad1 1;
                
## MAKE SURE IT USES AN ACTUAL USABLE NUMBER FROM THE NET ARRAY
                
}elseif(!in_array($achunk,$netArr)){
                    
$bad1 1;
                
## MAKE SURE WE DIDN'T GET A BAD SUBNET LIKE 255.162.255.0
                
}elseif(isset($lastchunk) && $lastchunk 255 && $achunk != 0){
                    
$bad1 1;
                }
                
$lastchunk $achunk;
            }
            if(isset(
$bad1)){
                return 
0;
            }else{
                return 
1;
            }
        
## IF IT IS CIDR FORMAT
        
}elseif(preg_match('/[0-9]{1,2}/',$net)){
            
## MAKE SURE IT IS WITHIN THE PROPER NUMERIC RANGE
            
if($net <= || $net >= 33){
                
$bad1 1;
            }
            if(isset(
$bad1)){
                return 
0;
            }else{
                return 
1;
            }
        }else{
            return 
0;
        }
    }
    
    
## VALIDATE SUPERNET DATA
    
public function valSNET($net){
        
## WE WANT TO ALLOW EMPTY SUPERNETS
        
if(empty($net)){
            return 
1;
        
## MAKE SURE IT IS IN THE FORM OF AN IP ADDRESS
        
}elseif(preg_match('/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/',$net)){
            
$chunks preg_split('/\./',$net);
            
## AN ARRAY OF THE POSSIBLE NUMBERS A NETMASK COULD END WITH
            
$netArr = array(0=>0,128=>128,192=>192,224=>224,240=>240,248=>248,252=>252,254=>254,255=>255);
            foreach(
$chunks as $achunk){
                
## MAKE SURE IT IS WITHIN THE PROPER NUMERIC RANGE
                
if($achunk || $achunk >= 256){
                    
$bad1 1;
                
## MAKE SURE IT USES AN ACTUAL USABLE NUMBER FROM THE NET ARRAY
                
}elseif(!in_array($achunk,$netArr)){
                    
$bad1 1;
                
## MAKE SURE WE DIDN'T GET A BAD SUBNET LIKE 255.162.255.0
                
}elseif(isset($lastchunk) && $lastchunk 255 && $achunk != 0){
                    
$bad1 1;
                }
                
$lastchunk $achunk;
            }
            if(isset(
$bad1)){
                return 
0;
            }else{
                return 
1;
            }
        
## IF IT IS IN CIDR FORMAT
        
}elseif(preg_match('/[0-9]{1,2}/',$net)){
            if(
$net <= || $net >= 33){
                
$bad1 1;
            }
            if(isset(
$bad1)){
                return 
0;
            }else{
                return 
1;
            }
        }
    }
    
}
?>