正则表达式用于修剪 IPv4 八位字节的前导零


Regex to trim leading zeros from IPv4 octets

我在PHP脚本中使用以下正则表达式来收集IPv4地址,并对IPv4地址执行一些验证。

IP 的 txt 文件使用 file() 命令读入数组,然后使用 preg_match 进行 foreach 循环,此正则表达式与 IPv4 地址匹配。

但是,它目前在每个八位字节之前包含任何前导零。

是否可以改进此正则表达式以修剪每个八位字节中的任何前导零,而无需完全丢弃具有前导零的 IP?我宁愿在单个正则表达式中执行此操作,而不是添加一个额外的函数来清除前导零。

/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/

正确输出:

38.10.125.242
38.1.1.24

输出不正确:

038.010.125.242
038.001.001.024

我一直在使用 Lumadis.be 进行测试,但我从堆栈溢出中的其他答案中尝试的正则表达式似乎都不起作用?

更简单的只是:

preg_replace('/'b0+/', '', $str);

因为我们知道唯一的单词边界在 . 和行的开头/结尾

编辑:看起来我们需要向前看以避免空八位字节

preg_replace('/'b0+(?='d)/', '', $str)

为什么不使用filter_var和一个简单的转换表达式:

// strip leading zeroes from each octet
$str = preg_replace('/(?<=^|'.)0+(?='d)/', '', $str);
if (filter_var($str, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) {
  // valid ipv4 address
}
$ips = preg_replace('/(^|'D)00?/i', '$1', $ips);

此正则表达式假定 ip 始终采用 ### 示例:000.000.000.000 格式

在这里测试它:https://regex101.com/r/3kFwu0/1

较短版本:(来源)

 $ips = preg_replace(''b0+'B', '', $ips);