在PHP中屏蔽IPv4和IPv6

在PHP中屏蔽IPv4和IPv6,php,regex,ip,Php,Regex,Ip,我试图在PHP中屏蔽IPv4和IPv6字符串的最后一部分,但同时。我的意思是,192.168.0.1或192.168.0.255将同时显示192.168.0.XXX和2001:0db8:85a3:0000:0000:8a2e:0370:7334将变成2001:0db8:85a3:0000:0000:8a2e:0370:XXX 这在PHP中可能吗?我知道使用IPv4我可以做到这一点: preg_replace('/([0-9]+\\.[0-9]+\\.[0-9]+)\\.[0-9]+/', '\\

我试图在PHP中屏蔽IPv4和IPv6字符串的最后一部分,但同时。我的意思是,192.168.0.1或192.168.0.255将同时显示192.168.0.XXX和2001:0db8:85a3:0000:0000:8a2e:0370:7334将变成2001:0db8:85a3:0000:0000:8a2e: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个十六进制数字块。处理这个问题留给读者一个练习。

我最终使用了一种不同的方法,它不涉及正则表达式,而且在我看来,它让我处理起来简单多了。此外,它还允许缩写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);
}

这使我可以使用以下事实来确定IP地址的类型:IPv6为“;IPv4为“;然后替换字符串的最后一部分。将1添加到$replace_num是必需的,因为如果不是,它将删除最后一个“:”或“.”,这不是我需要的。

为IPv6创建另一个模式。然后将这两种模式与
|
组合以匹配其中一种模式。