无论是使用PHP还是使用RegExp (或两者兼而有之),我如何匹配一系列IP地址?
抽样输入的IP
10.210.12.12
10.253.12.12
10.210.12.254
10.210.12.95
10.210.12.60样本范围
10.210.12.0/24
10.210.12.0/16
10.210.*.*
10.*.*.*我知道我能做到
?:(?: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]?)...but,它不考虑范围。它只允许您匹配一个传入数字,以查看它是否是一个IP地址,其中每个八位数为0-255。
编辑:
我在php.net上对ip2long函数的评论中也发现了这个函数。
function ip_in_network($ip, $net_addr, $net_mask){
if($net_mask <= 0){ return false; }
$ip_binary_string = sprintf("%032b",ip2long($ip));
$net_binary_string = sprintf("%032b",ip2long($net_addr));
return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0);
}
ip_in_network("192.168.2.1","192.168.2.0",24); //true
ip_in_network("192.168.6.93","192.168.0.0",16); //true
ip_in_network("1.6.6.6","128.168.2.0",1); //false它又短又甜,但不符合星号的情况。我也不知道它是否完全准确,因为当我认为这是一个错误时,它会返回一个真实的结果:
echo ip_in_network("192.168.2.1","192.167.0.0",1);...but,也许我误解了/1会是什么。也许我需要使用/24。
发布于 2018-05-21 09:16:43
使用这个库:https://github.com/S1lentium/IPTools
//Check if IP is within Range:
echo Range::parse('192.168.1.1-192.168.1.254')->contains(new IP('192.168.1.5')); // true
echo Range::parse('::1-::ffff')->contains(new IP('::1234')); // truehttps://stackoverflow.com/questions/10421613
复制相似问题