1. 程式人生 > >PHP 檢查IP地址 合法性 ipaddr int string 轉換

PHP 檢查IP地址 合法性 ipaddr int string 轉換

* ip.php

<?php

function check_ip_validity($ip) {
    $pat = '/\d{1,3}\.\d{1,3}\.\d{1,3}+\.\d{1,3}/';
    $r = preg_match( $pat, $ip );
    if (empty($r)) {
        return false;
    }
    $b = explode('.', $ip);
    
    $a = array_map(function($it) {
        $len = strlen($it);
        $code = 0;
        for ($i = 0; $i < $len; $i++) {
            $code = 10 * $code + ord($it[$i]) - 48;
        }
        return $code;
    }, $b);

    $every = function(array $a, callable $f) {
        for ($i = 0, $n = count($a); $i < $n; $i++) {
            if (! $f($a[$i], $i) ) {
                return false;
            }
        }
        return true;
    };
    return $every($a, function($it) {
        return (0 <= $it && $it <= 255);
    });
}

function ip2int(string $ip) : int {
    $b = explode('.', $ip);

    $a = array_map(function($it) {
        $len = strlen($it);
        $code = 0;
        for ($i = 0; $i < $len; $i++) {
            $code = 10 * $code + ord($it[$i]) - 48;
        }
        return $code;
    }, $b);

    $reduce = function(array $a, callable $c, $ini = 0) {
        $acc = $ini;
        for ($i = 0, $n = count($a); $i < $n; $i++) {
            $acc = $c($acc, $a[$i], $i);
        }
        return $acc;
    };

    return $reduce($a, function($acc, $item, $index) {
        $acc |= $item << (3-$index)*8;
        return $acc;
    }, 0);
}

function int2ip(int $bytes) : string {
    $bytes &= 0xffffffff;
    $a = $bytes >> 24;
    $b = $bytes >> 16 & 0x00ff;
    $c = $bytes >> 8 & 0x0000ff;
    $d = $bytes & 0x000000ff;
    return sprintf("%d.%d.%d.%d", $a, $b, $c, $d);
}

* test:

var_dump(check_ip_validity('192.168.4.157'));
var_dump(check_ip_validity('3232236712'));

$ipi = ip2int('47.96.133.100');
echo $ipi.PHP_EOL;

$ips = int2ip($ipi);
echo $ips.PHP_EOL;

 

* run:

$ php ip.php

bool(true)
bool(false)
794854756
47.96.133.100