в массиве $ white. У меня есть список ip, подобный этому (около 10000-12000 ips)
74.125.244.0/22
207.126.144.0/20
77.238.189.
212.211.149.128/26
194.25.134.8
194.25.134.9
194.25.134.12
174.2.114.12-174.2.115.255
153.2.242.243
153.2.244.12
153.2.244.50
153.2.244.63
153.2.246.30
153.2.246.31
153.2.246.35
153.2.247.30
153.2.247.31
153.2.247.32
Итак, список ip в массиве $ white может содержать ip (s) в этих трех форматах
153.2.247.32 (simple ip address)
207.126.144.0/20 ( CIDR notation )
174.2.114.12-174.2.115.255 ( Hyphenated ranges )
Моя цель - проверить, присутствуют ли ips, перечисленные в другом массиве, $ ips (около 1000-2000 ips), в белом списке.
Формат в $ ipsсписок - это просто простой IP-адрес, такой как
207.126.144.0
207.126.141.2
201.126.144.5
Я делаю это
foreach ($ips as $check) {
if (in_array($check,$white)){
echo "Ip $check exists";
}
}
Однако хорошо проверять только простые IP-адреса, но я не могу проверить, указаны ли ips в $ ipsсодержатся в диапазонах переносов и CIDR в $ white.
Я нашел решение, используя ip_in_range.php https://github.com/irazasyed/php-ip-range/blob/master/ip_in_range.php
foreach ($ips as $check) {
if (in_array($check,$white))
{
echo "Ip $check exists";
}
else
{
foreach( $white as $checkrange )
{
if (substr_count($checkrange, '/')>=1 or substr_count($checkrange, '-')>=1 )
{
if (ip_in_range($check, $checkrange))
{
echo "Ip $check exists";
break;
}
}
}
}
}
Но это очень медленно, потому что $ white и $ ipsогромные списки. Существует ли более быстрое и эффективное решение?