Php 正则表达式从IPv4八位字节中修剪前导零
我在PHP脚本中使用以下正则表达式来收集IPv4地址,并对IPv4地址执行一些验证 使用Php 正则表达式从IPv4八位字节中修剪前导零,php,regex,Php,Regex,我在PHP脚本中使用以下正则表达式来收集IPv4地址,并对IPv4地址执行一些验证 使用file()命令将IP的txt文件读入数组,然后使用preg\u match执行foreach循环,该正则表达式匹配IPv4地址 但是,它当前在每个八位字节之前包含任何前导零 在不完全丢弃带前导零的IP的情况下,是否可以将此正则表达式改进为修剪每个八位字节中的任何前导零?我更愿意在单个正则表达式中执行此操作,而不是添加额外的函数来清除前导零 /(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0
file()
命令将IP的txt文件读入数组,然后使用preg\u 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
输出不正确:
38.10.125.242
38.1.1.24
038.010.125.242
038.001.001.024
我一直在使用它进行测试,但我在Stack Overflow中的其他答案中尝试的正则表达式似乎都不起作用?更简单的是:
preg_replace('/\b0+/', '', $str);
因为我们知道唯一的单词边界是在。以及生产线的起点/终点
编辑:看来我们需要提前查看以避免出现空的八位字节
preg_replace('/\b0+(?=\d)/', '', $str)
更简单的是:
preg_replace('/\b0+/', '', $str);
因为我们知道唯一的单词边界是在。以及生产线的起点/终点
编辑:看来我们需要提前查看以避免出现空的八位字节
preg_replace('/\b0+(?=\d)/', '', $str)
为什么不使用
filter\u 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
}
//从每个八位字节中去掉前导零
$str=preg_replace('/(?为什么不使用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
}
//从每个八位字节中去掉前导零
$str=preg_replace('/(?我不明白为什么您不想要前导零。根据什么也不正确?它用于FreeBSD pf表,前导零出现故障。您不能“删除”前导零没有实际应用一些逻辑函数。这是一种需要PHP5.3+的奇特功能。另一个注意事项:由于性能问题,我不会在循环中使用preg\u match()
。您可以查看preg\u grep()
,或者只使用我之前展示的方法……您可以简单地preg\u replace('/\.0+/','.')
@HamZa这似乎也删除了单零八位字节。ie 38.10.0.0将输出到38.10。您是否有一个preg\u replace()
regex可能会起作用。这里列出的所有代码在本场景或您附加的代码中都不起作用。我不明白您为什么不想要前导零。根据什么也不正确?它在FreeBSD pf表中使用,前导零出现故障。您无法“删除”前导零没有实际应用一些逻辑函数。这是一种需要PHP5.3+的奇特功能。另一个注意事项:由于性能问题,我不会在循环中使用preg\u match()
。您可以查看preg\u grep()
,或者只使用我之前展示的方法……您可以简单地preg\u replace('/\.0+/','.')
@HamZa这似乎也删除了单零八位字节。ie 38.10.0.0将输出到38.10。您是否有一个preg\u replace()
regex可能会起作用。此处列出的所有选项在此场景或附加代码中都不起作用。这似乎也会删除单零八位字节。ie 38.10.0.0将输出到38.10。抱歉,您发布了新的编辑?看起来是一样的?所有其他答案都有相同的效果(删除单零八位字节)答对了!这似乎有效。我会确认是否发现任何异常。谢谢@pguardiariot这似乎也删除了单零八位组。ie 38.10.0.0将输出到38.10。对不起,你发布了新编辑吗?看起来是一样的?所有其他答案都有相同的效果(删除单零八位组)答对了!这似乎有效。我会确认是否发现任何异常。感谢@pguardiarioIt对这些示例“038.010.000.000”、“008.010.0.0”输出到38.10.00.00、08.10.0.0似乎不起作用。仍然保留一些前导零。对这些示例“038.010.000.000”、“008.010.0.0”似乎不起作用输出到38.10.00.00、08.10.0.0。仍保留一些前导零。