我在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);