如何从IP数组的所有值中去除CIDR标记?
移除IP数组中的CIDR标记(/32)解决方案
我来帮你搞定这个问题!你现在的代码只是把逗号分隔的字符串拆成了数组,但每个元素还带着/32标记,甚至可能有多余的空格,咱们一步步来修正:
先看你的初始代码
$ip_addresses = "1.1.1.1/32, 2.2.2.2/32, 3.3.3.3/32"; $ip_addresses_stripped_array = explode(",", $ip_addresses);
运行这段代码后,数组里的元素会是["1.1.1.1/32", " 2.2.2.2/32", " 3.3.3.3/32"]——不仅有/32,第二个和第三个元素前面还有空格,得一起处理掉。
方法1:简单直接(只针对/32的情况)
用array_map遍历数组,先去掉每个元素的前后空格,再替换掉/32:
$ip_addresses = "1.1.1.1/32, 2.2.2.2/32, 3.3.3.3/32"; // 第一步:拆分字符串为数组 $ip_array = explode(",", $ip_addresses); // 第二步:处理每个元素 $ip_addresses_stripped_array = array_map(function($ip) { // 先清理前后空格,再移除/32标记 return str_replace('/32', '', trim($ip)); }, $ip_array); // 可以打印结果验证 print_r($ip_addresses_stripped_array);
运行后得到的数组就是干净的IP:["1.1.1.1", "2.2.2.2", "3.3.3.3"]
方法2:更通用(支持任意CIDR前缀)
如果以后你的IP可能带其他前缀(比如/24、/16),用正则表达式提取IP部分更稳妥:
$ip_addresses = "1.1.1.1/32, 2.2.2.2/24, 3.3.3.3/16"; $ip_array = explode(",", $ip_addresses); $ip_addresses_stripped_array = array_map(function($ip) { // 正则匹配提取/之前的IP部分,同时自动忽略前后空格 preg_match('/^\s*([0-9\.]+)\s*\/.*$/', trim($ip), $matches); // 兜底处理:如果匹配失败(比如没有/),就返回清理空格后的原IP return $matches[1] ?? trim($ip); }, $ip_array); print_r($ip_addresses_stripped_array);
这个方法不管后面跟的是多少位的CIDR,都能准确提取出前面的纯IP地址。
内容的提问来源于stack exchange,提问作者Raymond Clayton Rudman
相关产品推荐
相关产品推荐

