正则表达式从IPv4八位字节修剪前导零

时间:2014-12-08 23:16:35

标签: php regex

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

使用file()命令将IP的txt文件读入数组,然后使用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进行测试,但是我在Stack Overflow中从其他答案中尝试的正则表达式似乎都没有用。?

2 个答案:

答案 0 :(得分:2)

简单就是:

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

因为我们知道唯一的单词边界是在。和行的开始/结束

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

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

答案 1 :(得分:2)

为什么不使用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
}