detain/iptools

PHP 网络地址操作库(IPv4 和 IPv6)

v3.0.3 2020-04-19 04:51 UTC

This package is auto-updated.

Last update: 2024-08-29 05:18:57 UTC


README

PHP 网络地址操作库(IPv4 和 IPv6)。

Build Status Coverage Status Code Climate

Latest Stable Version Total Downloads Latest Unstable Version License Monthly Downloads Daily Downloads composer.lock available

PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2 PHP 7.3 PHP 7.4

分支后的变更

  • 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 许可证发布。