Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式从IPv4八位字节中修剪前导零_Php_Regex - Fatal编程技术网

Php 正则表达式从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

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

使用
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。仍保留一些前导零。