Сравнение IP-адреса с IPv6-блоком

Я использую PHP для сравнения IP-адреса пользователя с списком IP-блоков, большинство из которых являются IPv4, но некоторые из них являются IPv6. IP-адрес, который я получаю от пользователя, всегда совместим с IPv4, или так я предполагаю. Как я могу сравнить это?

Это то, что я сейчас использую:

function ip_check($ip, $cidr) { list($net, $mask) = split("/", $cidr); $ip_address = decbin(ip2long($ip)); $ip_net = decbin(ip2long($net)); if (substr($ip_net, 0, $mask) == substr($ip_address, 0, $mask)) { return TRUE; } return FALSE; } 

Изменить: В качестве примера мне нужно выяснить, принадлежит ли 194.144.247.254 к 2001 году: 067c: 006c :: / 48 или 2001: 1a98 :: / 32 или 217.151.176.18/32 или 217.171.208.0/20 .

Solutions Collecting From Web of "Сравнение IP-адреса с IPv6-блоком"

Я написал библиотеку для сравнения такого IP-адреса .

 $ip = IP_Address::factory($ip); $block = IP_Network_Address::factory($cidr); return $block->encloses_address($ip); 

Иерархия классов немного тупо, потому что она предназначена для обеспечения прозрачного расширения Коханы.

Я не реализовал код для преобразования IPv4-адреса в специальный предиминированный IPv6-адрес, поэтому вам, возможно, придется провести небольшую проверку перед сравнением. Разумеется, запросы на выборку приветствуются 🙂

В качестве примера я должен убедиться, что 194.144.247.254 относится к 2001 году: 067c: 006c :: / 48 или 2001: 1a98 :: / 32 или 217.151.176.18/32 или 217.171.208.0/20 .

Как адрес IPv4 может принадлежать диапазону IPv6? Таким образом, вы можете сравнивать только те же типы адресов. Другое дело не имеет смысла.