在PHP中屏蔽IPv4和IPv6



我试图在PHP中屏蔽IPv4和IPv6字符串的最后一部分,但同时屏蔽。我的意思是,192.168.0.1或192.168.0.255都将显示192.168.0.XXX和2001:0db8:85a3:0000:0000:8a2e:0370:7334将变为2001:0db:853a3:0000:8a2 e:0370:XXX

这在PHP中可能吗?我知道有了IPv4,我就可以做到这一点:

preg_replace('/([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+/', '\1.xxx', $text);

有了这个,我可以屏蔽IPv4,但因为我对Regex不太熟悉,我很难弄清楚这一点。

使用|创建具有备选方案的模式。

preg_replace('/((?:d{1,3}\.){3}|(?:[da-f]{1,4}:){7})(?:[da-f]{1,4}|d{1,3})/', '$1xxx', $text);

请注意,这不适用于缩写的IPv6地址,因为它专门检查8个十六进制数字块。处理这个问题留给读者练习。

我最终使用了一种不同的方法,它不涉及Regex,在我看来,这让我处理它变得简单多了。此外,它还允许缩写IPv6地址。

if(strpos($ip, ':')){
//IPv6
$replace_num = strrpos($ip, ':') - strlen($ip) + 1;
$ip = substr_replace($ip, 'xxxx', $replace_num);
}
else{
//IPv4
$replace_num = strrpos($ip, '.') - strlen($ip) + 1;
$ip = substr_replace($ip, 'xxx', $replace_num);
}

这允许我仅使用具有":"对于IPv6和"以便IPv4确定IP地址的类型,然后只替换字符串的最后一部分。将1添加到$replace_num是必需的,因为如果不是,它将删除最后一个":"或"这不是我需要的。

最新更新