detain / iptools
PHP 网络地址操作库(IPv4 和 IPv6)
v3.0.3
2020-04-19 04:51 UTC
Requires
- php: >=5.6.0
- ext-bcmath: *
Requires (Dev)
README
PHP 网络地址操作库(IPv4 和 IPv6)。
分支后的变更
- 100% 代码覆盖率!
- 现在在 PHP v5.6, v7.0, v7.1, v7.2, v7.3, 和 v7.4 上测试
- 添加了 CodeClimate 覆盖率报告
- 添加了 containsAny 和 containsAll 到 Range 类,用于处理 IP/范围/网络的数组,而不是单个对象
- 添加了 excludeArray 到 Network 类,用于处理要排除的 IP/范围/网络的数组,而不是使用现有的 exclude 方法排除单个对象
安装
Composer:在命令行中运行
composer require detain/iptools
或者在 composer.json 中添加
{ "require": { "detain/iptools": "*" } }
用法
此库将处理分为 IP、范围 和 网络 类型,并提供相应的命名类,使处理所有 IP 事物变得更加简单。
IP 操作
$ip = new IP('192.168.1.1'); echo $ip->version;// IPv4
$ip = new IP('fc00::'); echo $ip->version; // IPv6
从整数、二进制和十六进制解析 IP
echo (string)IP::parse(2130706433); // 127.0.0.1 echo (string)IP::parse('0b11000000101010000000000100000001') // 192.168.1.1 echo (string)IP::parse('0x0a000001'); // 10.0.0.1
或者
echo (string)IP::parseLong(2130706433); // 127.0.0.1 echo (string)IP::parseBin('11000000101010000000000100000001'); // 192.168.1.1 echo (string)IP::parseHex('0a000001'); // 10.0.0.1
将 IP 转换为其他格式
echo IP::parse('192.168.1.1')->bin // 11000000101010000000000100000001 echo IP::parse('10.0.0.1')->hex // 0a000001 echo IP::parse('127.0.0.1')->long // 2130706433
其他公共属性
maxPrefixLength
地址表示中的最大位数:IPv4 为 32 位,IPv6 为 128 位。
octetsCount
IP 地址中的八位组数量:IPv4 为 4 个,IPv6 为 16 个
reversePointer
地址的 reverse DNS PTR 名称
echo new IP::parse('192.0.2.5')->reversePointer // 5.2.0.192.in-addr.arpa echo new IP::parse('2001:db8::567:89ab')->reversePointer // b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa
网络操作
echo Network::parse('192.0.0.1 255.0.0.0')->CIDR; // 192.0.0.0/8 echo (string)Network::parse('192.0.0.1/8')->netmask; // 255.0.0.0 echo (string)Network::parse('192.0.0.1'); // 192.0.0.1/32
从网络中排除 IP
$excluded = Network::parse('192.0.0.0/8')->exclude(new IP('192.168.1.1')); foreach($excluded as $network) { echo (string)$network . '<br>'; }
192.0.0.0/9
192.128.0.0/11
192.160.0.0/13
192.168.0.0/24
192.168.1.0/32
192.168.1.2/31
...
192.192.0.0/10
从网络中排除子网
$excluded = Network::parse('192.0.0.0/8')->exclude(new Network('192.168.1.0/24')); foreach($excluded as $network) { echo (string)$network . '<br>'; }
192.0.0.0/9
192.128.0.0/11
192.160.0.0/13
192.168.0.0/24
192.168.2.0/23
...
192.192.0.0/10
从网络中排除多个子网
$excluded = Network::parse('192.0.0.0/8')->excludeArray(['192.168.1.0/24', '192.168.2.0/24']); foreach($excluded as $network) { echo (string)$network . '<br>'; }
192.0.0.0/9
192.128.0.0/11
192.160.0.0/13
192.168.0.0/24
192.168.3.0/23
...
192.192.0.0/10
将网络分割成相等的子网
$networks = Network::parse('192.168.0.0/22')->moveTo('24'); foreach ($networks as $network) { echo (string)$network . '<br>'; }
192.168.0.0/24
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
迭代网络 IP 地址
$network = Network::parse('192.168.1.0/24'); foreach($network as $ip) { echo (string)$ip . '<br>'; }
192.168.1.0
...
192.168.1.255
获取网络主机地址作为范围
$hosts = Network::parse('192.168.1.0/24')->hosts // Range(192.168.1.1, 192.168.1.254); foreach($hosts as $ip) { echo (string)$ip . '<br>'; }
192.168.1.1
...
192.168.1.254
计算网络 IP 地址数量
echo count(Network::parse('192.168.1.0/24')) // 254
范围操作
以不同格式定义范围
$range = new Range(new IP('192.168.1.0'), new IP('192.168.1.255')); $range = Range::parse('192.168.1.0-192.168.1.255'); $range = Range::parse('192.168.1.*'); $range = Range::parse('192.168.1.0/24');
检查 IP 是否在范围内
echo Range::parse('192.168.1.1-192.168.1.254')->contains(new IP('192.168.1.5')); // true echo Range::parse('::1-::ffff')->contains(new IP('::1234')); // true
检查 IP 是否在任何范围内
echo Range::parse('192.168.1.1-192.168.1.254')->containsAny([new IP('192.168.0.5'), new IP('192.168.1.5')]); // true
检查 IP 是否在所有范围内
echo Range::parse('192.168.1.1-192.168.1.254')->containsAll([new IP('192.168.0.5'), new IP('192.168.1.5')]); // false echo Range::parse('192.168.1.1-192.168.1.254')->containsAll([new IP('192.168.1.6'), new IP('192.168.1.5')]); // true
迭代范围 IP 地址
$range = Range::parse('192.168.1.1-192.168.1.254'); foreach($range as $ip) { echo (string)$ip . '<br>'; }
192.168.1.1
...
192.168.1.254
获取适合指定 IP 地址范围的网络
$networks = Range::parse('192.168.1.1-192.168.1.254')->getNetworks(); foreach($networks as $network) { echo (string)$network . '<br>'; }
192.168.1.1/32
192.168.1.2/31
192.168.1.4/30
192.168.1.8/29
192.168.1.16/28
192.168.1.32/27
192.168.1.64/26
192.168.1.128/26
192.168.1.192/27
192.168.1.224/28
192.168.1.240/29
192.168.1.248/30
192.168.1.252/31
192.168.1.254/32
计算范围中的 IP 地址数量
echo count(Range::parse('192.168.1.1-192.168.1.254')) // 254
许可证
此库按照 MIT 许可证发布。