Это на тот случай, если вы решите пойти с моим комментарием, предлагая не использовать регулярные выражения. Не проверено (но, вероятно, работает или, по крайней мере, близко) в Perl:
@private = (
{network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') },
{network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
# ...
);
$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
# ip address is private
} else {
# ip address is not private
}
Обратите внимание, что @private
- это просто данные, которые вы можете легко изменить. Или загрузите на лету с Cymru Bogon Reference .
edit: Мне приходит в голову, что запрос регулярного выражения Perl не означает, что вы знаете Perl, поэтому ключевая строка - это grep, который просто зацикливается на каждом частном диапазоне адресов. Вы берете свой IP, побитовый и его с сетевой маской, и сравниваете с сетевым адресом. Если равен, то это часть этой частной сети.