首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配给定IP范围/掩码的IPv4地址?

匹配给定IP范围/掩码的IPv4地址?
EN

Stack Overflow用户
提问于 2012-05-02 20:58:00
回答 6查看 15.6K关注 0票数 7

无论是使用PHP还是使用RegExp (或两者兼而有之),我如何匹配一系列IP地址?

抽样输入的IP

代码语言:javascript
复制
10.210.12.12
10.253.12.12
10.210.12.254
10.210.12.95
10.210.12.60

样本范围

代码语言:javascript
复制
10.210.12.0/24
10.210.12.0/16
10.210.*.*
10.*.*.*

我知道我能做到

代码语言:javascript
复制
?:(?: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函数的评论中也发现了这个函数。

代码语言:javascript
复制
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

它又短又甜,但不符合星号的情况。我也不知道它是否完全准确,因为当我认为这是一个错误时,它会返回一个真实的结果:

代码语言:javascript
复制
echo ip_in_network("192.168.2.1","192.167.0.0",1);

...but,也许我误解了/1会是什么。也许我需要使用/24。

EN

Stack Overflow用户

回答已采纳

发布于 2018-05-21 09:16:43

使用这个库:https://github.com/S1lentium/IPTools

代码语言:javascript
复制
//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')); // true
票数 2
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10421613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档