【PHP】关于IPv4、IPv6 的操作函数
生活随笔
收集整理的這篇文章主要介紹了
【PHP】关于IPv4、IPv6 的操作函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 格式驗證
- [IPv4/IPv6 manipulation library for PHP](https://github.com/rlanvin/php-ip)
- [python IPaddr Lib](https://github.com/google/ipaddr-py)
- ip地址轉int
格式驗證
if (!function_exists('isIPv4')) {/*** 判斷值是否符合 IPv4 格式*/function isIPv4($ip = ''){return filter_var($ip, FILTER_VALIDATE_IP);} }if (!function_exists('checkIPAndDomain')) {/*** 驗證IPv4、IPv6、域名,不包括端口*/function checkIPAndDomain($val){$validIp46AndDomainRegex = "/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^(?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))$/";return preg_match($validIp46AndDomainRegex, $val);} }if (!function_exists('checkDomain')) {/*** 驗證Domain*/function checkDomain($val){$validDomainRegex = "/^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$/";return preg_match($validDomainRegex, $val);} }if (!function_exists('checkIPv4Port')) {/*** 驗證IPv4,支持端口* A.B.C.D:P*/function checkIPv4Port($val){$validIp4Regex = "/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\:([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-5]{2}[0-3][0-5]))$/";return preg_match($validIp4Regex, $val);} }if (!function_exists('checkIPv4Prefix')) {/*** 驗證IPv4前綴表達式* A.B.C.D/M*/function checkIPv4Prefix($val){$validIp4PrefixRegex = "/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([1|2]\d?|3[0-2]))$/";return preg_match($validIp4PrefixRegex, $val);} }if (!function_exists('checkIPv6')) {/*** 驗證IPv6* A:B:C:D::E*/function checkIPv6($val){$validIp6Regex = "/^(?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))$/";return preg_match($validIp6Regex, $val);} }if (!function_exists('checkIPv6Prefix')) {/*** 驗證IPv6Prefix* A:B:C:D::E/P*/function checkIPv6Prefix($val){$validIp6PrefixRegex = "/^(?:(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-fA-F]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,1}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,2}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:(?:[0-9a-fA-F]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,3}(?:(?:[0-9a-fA-F]{1,4})))?::(?:(?:[0-9a-fA-F]{1,4})):)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,4}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,5}(?:(?:[0-9a-fA-F]{1,4})))?::)(?:(?:[0-9a-fA-F]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-fA-F]{1,4})):){0,6}(?:(?:[0-9a-fA-F]{1,4})))?::))))(\/\b([1-9]\d?|1[0-1]\d|12[0-8])\b)$/";return preg_match($validIp6PrefixRegex, $val);} }if (!function_exists('ip2long_v6')) {/*** ipv6轉數字*/function ip2long_v6($ip){$ip_n = inet_pton($ip);$bin = '';for ($bit = strlen($ip_n) - 1; $bit >= 0; $bit--) {$bin = sprintf('%08b', ord($ip_n[$bit])) . $bin;}if (function_exists('gmp_init')) {return gmp_strval(gmp_init($bin, 2), 10);} elseif (function_exists('bcadd')) {$dec = '0';for ($i = 0; $i < strlen($bin); $i++) {$dec = bcmul($dec, '2', 0);$dec = bcadd($dec, $bin[$i], 0);}return $dec;} else {// trigger_error('GMP or BCMATH extension not installed!', E_USER_ERROR);return 'GMP or BCMATH extension not installed!';}} }if (!function_exists('long2ip_v6')) {/*** 數字轉為IPv6地址* 數字長度38位*/function long2ip_v6($dec){if (function_exists('gmp_init')) {$bin = gmp_strval(gmp_init($dec, 10), 2); //10進制 -> 2進制} elseif (function_exists('bcadd')) {$bin = '';do {$bin = bcmod($dec, '2') . $bin; //10進制 -> 2進制,獲取$dec/2的余數$dec = bcdiv($dec, '2', 0); // dec/2的值,0表示小數點后位數} while (bccomp($dec, '0'));} else {// trigger_error('GMP or BCMATH extension not installed!', E_USER_ERROR);return 'GMP or BCMATH extension not installed!';}$bin = str_pad($bin, 128, '0', STR_PAD_LEFT); // 給2進制值補0$ip = [];for ($bit = 0; $bit <= 7; $bit++) {$bin_part = substr($bin, $bit * 16, 16); // 每16位分隔$ip[] = dechex(bindec($bin_part)); // 2進制->10進制->16進制}$ip = implode(':', $ip);// inet_pton:將可讀的IP地址轉換為其壓縮的in_addr表示形式// inet_ntop:將打包的Internet地址轉換為可讀的表示形式return inet_ntop(inet_pton($ip));} }if (!function_exists('long2ip_v4')) {/*** 代替 long2ip 函數,整數轉IPv4* 4294967295: FFFF FFFF* 32位1* @param $dec* @return string*/function long2ip_v4($dec){$long = 4294967295 - ($dec - 1);$longInt = (int) $long;return long2ip(-$longInt);} }if (!function_exists('ip2long_v4')) {/*** 代替 ip2long 函數* @param $ip* @return string*/function ip2long_v4($ip){return sprintf("%u", ip2long($ip));} }if (!function_exists('isPrivateIp')) {/*** 是否是私有IP地址* 是:true,* 否:false,*/function isPrivateIp($ip){return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);} }if (!function_exists('isPublicIp')) {/*** 是否是公有IP地址* 是:true,* 否:false,*/function isPublicIp($ip){return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);} }IPv4/IPv6 manipulation library for PHP
python IPaddr Lib
ip地址轉int
轉自:https://inkplant.com/code/ipv6-to-number
function ipaddress_to_ipnumber($ipaddress, $hex=10) {$pton = @inet_pton($ipaddress);if (!$pton) { return false; }$number = '';foreach (unpack('C*', $pton) as $byte) {$number .= str_pad(decbin($byte), 8, '0', STR_PAD_LEFT);}if(2==$hex){return $number;}return base_convert(ltrim($number, '0'), 2, 10); }示例: echo ipaddress_to_ipnumber('67.177.162.18'); //returns 1135714834echo ipaddress_to_ipnumber('148.90.78.177'); //returns 2488946353echo ipaddress_to_ipnumber('131.228.17.26'); //returns 2212761882echo ipaddress_to_ipnumber('FE80:0000:0000:0000:0202:B3FF:FE1E:8329'); //returns 338288524927261046600406220626806860202echo ipaddress_to_ipnumber('2001:558:100A:4:68:87:68:162'); //returns 42540596551066024442460608008464284482echo ipaddress_to_ipnumber('bogus'); //returns echo ipaddress_to_ipnumber('::1'); //returns 1echo ipaddress_to_ipnumber('10.0.0.1'); //returns 167772161 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【PHP】关于IPv4、IPv6 的操作函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络端口分类
- 下一篇: Docker-compose 安装配置