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

2023-11-23

使用 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]?)

...但它没有考虑范围。它只是让您匹配传入的号码,看看它是否是每个八位字节为 0-255 的 IP 地址。

EDIT:

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

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


我改编了 php.net 的答案并使其变得更好。

function netMatch($network, $ip) {
    $network=trim($network);
    $orig_network = $network;
    $ip = trim($ip);
    if ($ip == $network) {
        echo "used network ($network) for ($ip)\n";
        return TRUE;
    }
    $network = str_replace(' ', '', $network);
    if (strpos($network, '*') !== FALSE) {
        if (strpos($network, '/') !== FALSE) {
            $asParts = explode('/', $network);
            $network = @ $asParts[0];
        }
        $nCount = substr_count($network, '*');
        $network = str_replace('*', '0', $network);
        if ($nCount == 1) {
            $network .= '/24';
        } else if ($nCount == 2) {
            $network .= '/16';
        } else if ($nCount == 3) {
            $network .= '/8';
        } else if ($nCount > 3) {
            return TRUE; // if *.*.*.*, then all, so matched
        }
    }

    echo "from original network($orig_network), used network ($network) for ($ip)\n";

    $d = strpos($network, '-');
    if ($d === FALSE) {
        $ip_arr = explode('/', $network);
        if (!preg_match("@\d*\.\d*\.\d*\.\d*@", $ip_arr[0], $matches)){
            $ip_arr[0].=".0";    // Alternate form 194.1.4/24
        }
        $network_long = ip2long($ip_arr[0]);
        $x = ip2long($ip_arr[1]);
        $mask = long2ip($x) == $ip_arr[1] ? $x : (0xffffffff << (32 - $ip_arr[1]));
        $ip_long = ip2long($ip);
        return ($ip_long & $mask) == ($network_long & $mask);
    } else {
        $from = trim(ip2long(substr($network, 0, $d)));
        $to = trim(ip2long(substr($network, $d+1)));
        $ip = ip2long($ip);
        return ($ip>=$from and $ip<=$to);
    }
}

function ech($b) {
    if ($b) {
        echo "MATCHED\n";
    } else {
        echo "DID NOT MATCH\n";
    }
}

echo "CLASS A TESTS\n";
ech(netMatch('10.168.1.0-10.168.1.100', '10.168.1.90'));
ech(netMatch('10.168.*.*', '10.168.1.90'));
ech(netMatch('10.168.0.0/16', '10.168.1.90'));
ech(netMatch('10.169.1.0/24', '10.168.1.90'));
ech(netMatch('10.168.1.90', '10.168.1.90'));
echo "\nCLASS B TESTS\n";
ech(netMatch('130.168.1.0-130.168.1.100', '130.168.1.90'));
ech(netMatch('130.168.*.*', '130.168.1.90'));
ech(netMatch('130.168.0.0/16', '130.168.1.90'));
ech(netMatch('130.169.1.0/24', '130.168.1.90'));
ech(netMatch('130.168.1.90', '130.168.1.90'));
echo "\nCLASS C TESTS\n";
ech(netMatch('192.168.1.0-192.168.1.100', '192.168.1.90'));
ech(netMatch('192.168.*.*', '192.168.1.90'));
ech(netMatch('192.168.0.0/16', '192.168.1.90'));
ech(netMatch('192.169.1.0/24', '192.168.1.90'));
ech(netMatch('192.168.1.90', '192.168.1.90'));
echo "\nCLASS D TESTS\n";
ech(netMatch('230.168.1.0-230.168.1.100', '230.168.1.90'));
ech(netMatch('230.168.*.*', '230.168.1.90'));
ech(netMatch('230.168.0.0/16', '230.168.1.90'));
ech(netMatch('230.169.1.0/24', '230.168.1.90'));
ech(netMatch('230.168.1.90', '230.168.1.90'));
echo "\nCLASS E TESTS\n";
ech(netMatch('250.168.1.0-250.168.1.100', '250.168.1.90'));
ech(netMatch('250.168.*.*', '250.168.1.90'));
ech(netMatch('250.168.0.0/16', '250.168.1.90'));
ech(netMatch('250.169.1.0/24', '250.168.1.90'));
ech(netMatch('250.168.1.90', '250.168.1.90'));

结果是:

CLASS A TESTS
from orig network (10.168.1.0-10.168.1.100) used network (10.168.1.0-10.168.1.100) for (10.168.1.90)
MATCHED
from orig network (10.168.*.*) used network (10.168.0.0/16) for (10.168.1.90)
MATCHED
from orig network (10.168.0.0/16) used network (10.168.0.0/16) for (10.168.1.90)
MATCHED
from orig network (10.169.1.0/24) used network (10.169.1.0/24) for (10.168.1.90)
DID NOT MATCH
used network (10.168.1.90) for (10.168.1.90)
MATCHED

CLASS B TESTS
from orig network (130.168.1.0-130.168.1.100) used network (130.168.1.0-130.168.1.100) for (130.168.1.90)
MATCHED
from orig network (130.168.*.*) used network (130.168.0.0/16) for (130.168.1.90)
MATCHED
from orig network (130.168.0.0/16) used network (130.168.0.0/16) for (130.168.1.90)
MATCHED
from orig network (130.169.1.0/24) used network (130.169.1.0/24) for (130.168.1.90)
DID NOT MATCH
used network (130.168.1.90) for (130.168.1.90)
MATCHED

CLASS C TESTS
from orig network (192.168.1.0-192.168.1.100) used network (192.168.1.0-192.168.1.100) for (192.168.1.90)
MATCHED
from orig network (192.168.*.*) used network (192.168.0.0/16) for (192.168.1.90)
MATCHED
from orig network (192.168.0.0/16) used network (192.168.0.0/16) for (192.168.1.90)
MATCHED
from orig network (192.169.1.0/24) used network (192.169.1.0/24) for (192.168.1.90)
DID NOT MATCH
used network (192.168.1.90) for (192.168.1.90)
MATCHED

CLASS D TESTS
from orig network (230.168.1.0-230.168.1.100) used network (230.168.1.0-230.168.1.100) for (230.168.1.90)
MATCHED
from orig network (230.168.*.*) used network (230.168.0.0/16) for (230.168.1.90)
MATCHED
from orig network (230.168.0.0/16) used network (230.168.0.0/16) for (230.168.1.90)
MATCHED
from orig network (230.169.1.0/24) used network (230.169.1.0/24) for (230.168.1.90)
DID NOT MATCH
used network (230.168.1.90) for (230.168.1.90)
MATCHED

CLASS E TESTS
from orig network (250.168.1.0-250.168.1.100) used network (250.168.1.0-250.168.1.100) for (250.168.1.90)
MATCHED
from orig network (250.168.*.*) used network (250.168.0.0/16) for (250.168.1.90)
MATCHED
from orig network (250.168.0.0/16) used network (250.168.0.0/16) for (250.168.1.90)
MATCHED
from orig network (250.169.1.0/24) used network (250.169.1.0/24) for (250.168.1.90)
DID NOT MATCH
used network (250.168.1.90) for (250.168.1.90)
MATCHED
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匹配给定 IP 范围/掩码的 IPv4 地址? 的相关文章

  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • 正则表达式以任何顺序匹配查询中的所有单词

    我正在尝试为一个项目构建一个搜索功能 该功能根据用户搜索输入以及它是否与针对项目列出的关键字匹配来缩小项目范围 为此 我将项目关键字保存在data属性并使用 RegExp 模式将查询与这些关键字进行匹配 我目前正在使用这个表达式 我知道它不
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 仅获取 IPv4 地址,bat 文件中不包含“IPv4 地址. . . . . . . . . . :”

    我将创建一个小批处理文件 将我的 IP 地址直接复制到剪贴板 我努力了 echo off ipconfig find IPv4 clip pause 但给了我 IPv4 Address 192 168 xx xx 有没有办法只能得到192
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • ::(双冒号)在 DOS 批处理文件中意味着什么?

    我找到了这个程序web archive org http baiyunmanor com blog work get current date time in dos batch file This uses Windows Scripti
  • JPA 标准生成器:如何按顺序替换字符串并将其转换为数字?

    有人可以建议我如何使用 JPA Criteria 构建器 API 构建以下查询吗 SELECT id name date version FROM public upgradeTable order by CAST replace vers
  • 快速计算 .numpy 数组中每 N 行的平均值

    我有一个非常大的屏蔽 NumPy 数组 originalArray 有很多行和两列 我想取每两行的平均值originalArray并建立一个newArray其中每一行是两行的平均值originalArray so newArray行数为or
  • 在 javascript 或着色器中更好地乘以矩阵?

    我一直在看几个 webgl 示例 考虑MDN 的教程 他们的顶点着色器将顶点乘以透视矩阵和世界位置矩阵 gl Position uPMatrix uMVMatrix vec4 aVertexPosition 1 0 But the uMVM
  • Java序列化-Android反序列化

    我尝试过在 Java 和 Android 之间实现跨平台序列化 我使用了 Serialized 并将 Android 中的代码与桌面 Java 中的代码放在同一个包中 来源 java desktop 序列化 Student student
  • 从 Service Fabric 集群中删除应用程序

    我尝试使用服务结构资源管理器从服务结构中删除应用程序 我使用 删除应用程序 操作删除了我的应用程序 然后 当我尝试取消配置应用程序类型时 我收到错误消息 错误 版本 1 0 0 的应用程序类型无法取消配置为 它仍然包含活动的应用程序 我可以
  • “await Task.Run(); return;”之间的任何区别和“返回Task.Run()”? [复制]

    这个问题在这里已经有答案了 以下两段代码之间是否存在概念上的差异 async Task TestAsync await Task Run gt DoSomeWork and Task TestAsync return Task Run gt
  • 计算文件中的单词数

    我在计算文件中的字数时遇到问题 我采取的方法是 当我看到空格或换行符时 我就知道要计算单词数 问题是 如果我在段落之间有多行 那么我最终也会将它们算作单词 如果您查看 readFile 方法 您就可以看到我在做什么 您能帮助我并指导我如何解
  • Monad 变压器的使用

    我正在 Haskell 书中读到有关 monad 转换器的内容 作者提到如下 莫纳德呢 组合两个任意数据类型没有问题 有 Monad 实例 我们在使用 Compose 时已经看到了这一点 Maybe 和 list 都定义了 Monad 实例
  • Github - 文件 XYZ 为 126.80 MB;这超出了 GitHub 的文件大小限制 100.00 MB

    我有一个本地存储库 其中意外添加了一个大文件 现在我落后了近 100 个提交 当我尝试推送到 GitHub 时 出现错误 我需要帮助做任何我需要做的事情才能推送这个存储库的其余部分 我不需要这个文件 可以永久删除它 旁注 这是一个包含 IP
  • RoR 预编译资产在 rake asset:precompile 时失败 - 在基本上空的 application.js 上

    Running bundle exec rake assets precompile RAILS ENV production trace Execute assets precompile primary rake aborted Typ
  • 将带重音的文本转换为 ASCII 字符?

    我想在 Javascript 中将重音字母和各种编码转换为纯英文 ASCII 编码 并想知道有哪些可能的选项 我需要的是 clair becomes eclair b r becomes bar becomes privet becomes
  • R 中的对数刻度图

    我想绘制聚类系数和平均最短 路径作为 Watts Strogatz 模型参数 p 的函数如下 这是我的代码 library igraph library ggplot2 library reshape2 library pracma p l
  • 将顶点大小与 igraph 中的标签大小匹配

    我正在尝试使用 R 中的 igraph 绘制小型网络 网络中的每个顶点都有一个名称 相当于其标签 我想让每个顶点都有一个矩形符号 该符号足够大以适合其标签 这是我的主要灵感 使用 igraph 执行此操作的最佳方法是什么 编辑 更多信息 代
  • 我可以在没有预览的情况下使用 Android 相机吗?

    我在 Android 中创建了一个应用程序 使用相机可以测量用户脸部到手机屏幕之间的距离 问题描述 现在我想让它在后台运行 以便在我使用其他应用程序时可以使用该功能 它的意思是我应该在没有预览的情况下打开服务中的相机 并在服务中处理它 我还
  • 用 C# 制作图形饼图

    我正在尝试编写一个 Windows 应用程序 显示一个带有七个不等切片 25 20 18 17 10 10 10 的饼图 所有切片的颜色都不同 到目前为止 我已经制作了附有颜色的钢笔和画笔并画了一个圆圈 这就是我到目前为止所拥有的 priv
  • 在特定轴刻度上应用粗体字体

    这是一个情节 library ggplot2 library tibble ggplot head mtcars gt rownames to column cars aes x reorder cars drat y drat geom
  • log4net AdoNetAppender - SqlParameterCollection 不包含参数

    在我的一个项目中 我收到此错误 System IndexOutOfRangeException SqlParameterCollection does not contain SqlParameter with ParameterName
  • JavaScript 替换/正则表达式

    给定这个函数 function Repeater template var repeater markup template replace function pattern value this markup this markup re
  • 匹配给定 IP 范围/掩码的 IPv4 地址?

    使用 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