【问题标题】:Mask both IPv4 and IPv6 in PHP在 PHP 中同时屏蔽 IPv4 和 IPv6
【发布时间】:2021-07-30 05:28:42
【问题描述】:

我试图在 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 不太熟悉,所以我很难弄清楚。

【问题讨论】:

  • 为 IPv6 制作另一种模式。然后将这两个模式与| 结合起来以匹配其中任何一个。

标签: php regex ip


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我最终使用了一种不涉及 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 地址的类型,然后只替换字符串的最后一部分。需要在 $replace_num 中添加 1,因为如果不添加它将删除最后一个“:”或“。”这不是我需要的。

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 2016-01-17
      • 2015-09-16
      • 2012-05-09
      • 2010-12-09
      • 1970-01-01
      • 2013-03-18
      • 2012-09-10
      • 2013-07-03
      相关资源
      最近更新 更多