【发布时间】:2018-07-23 20:34:16
【问题描述】:
我需要匿名化 IPv4 和 IPv6 地址,所以我编写了这个粗略的解决方案:
if (strlen($_SERVER['REMOTE_ADDR']) <= 15) { // Sorry: 15 NOT 12
echo htmlentities(substr_replace($_SERVER['REMOTE_ADDR'], 'XXX', -3), ENT_QUOTES);
} else {
echo htmlentities(substr_replace($_SERVER['REMOTE_ADDR'], 'XXXX:XXXX', -9), ENT_QUOTES);
}
它适用于全长 IPv4 和 IPv6 地址,例如
207.142.131.005
2001:0db8:0000:08d3:0000:8a2e:0070:7344
但不能使用缩写地址,例如
207.142.131.5
2001:0db8::8d3::8a2e:7:7344
我想知道 preg_replace 和一些正则表达式魔术是否有一个优雅的解决方案?
【问题讨论】:
-
preg_replace('/^.*$/', 'ANONYMOUS', $_SERVER['REMOTE_ADDR'])将用 "ANONYMOUS" 替换所有内容......可能不是你想要的,但它符合简短:P -
顺便说一下 localhost 是
::1肯定少于 12 个字符,所以 strlen 可能不是区分 v4 和 v6 的最佳方法 -
不需要
htmlentities()。 IP 地址仅包含数字 (0..9) 和点 (.) (IPv4) 或十六进制数字 (0..9,a..f)和冒号 (:) (IPv6)。这些字符在 HTML 中并不特殊,htmlentities()返回未修改的输入字符串。 -
确实,你不能只看长度。例如,全球 IPv6 地址
2600::是有效的,并且是 Internet 上的路由器。
标签: php regex preg-replace ipv6 ipv4