在 PHP 中屏蔽 IPv4 和 IPv6

Mask both IPv4 and IPv6 in PHP

我试图同时屏蔽 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,但是因为我不太熟悉正则表达式,所以我很难弄明白。

使用 | 创建一个带有备选方案的模式。

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

请注意,这不适用于缩写的 IPv6 地址,因为它专门检查 8 个十六进制数字块。处理这个留作 reader.

的练习。

我最终使用了一种不同的方法,它不涉及正则表达式,而且在我看来,这让我处理它变得更加简单。另外,它允许使用缩写的 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 地址的类型,然后只需替换字符串的最后一部分。向 $replace_num 添加 1 是必需的,如果不是,它将删除最后一个“:”或“。”这不是我需要的。