最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何在PHP中完成批量IP地址文本文件搜索
时间:2026-07-15 19:46:51 编辑:袖梨 来源:一聚教程网
本文介绍如何修改php脚本,使其支持在txt文件中批量匹配多个ip地址(以换行或空格分隔),解决单ip可查、多ip失效的问题,并提供健壮的正则匹配与结果去重方案。
本文介绍如何修改php脚本,使其支持在txt文件中批量匹配多个ip地址(以换行或空格分隔),解决单ip可查、多ip失效的问题,并提供健壮的正则匹配与结果去重方案。
原始代码的核心问题在于:它将整个文本域($_POST['q'])作为单一搜索模式,直接用于正则匹配。当用户输入多个IP(如 127.0.0.1n44.222.223.22)时,$find 变量包含换行符和空白,而 $pattern 被构造成一个试图完整匹配含换行的字符串的正则(例如 /^.*127.0.0.1n44.222.223.22.*$/m),这显然无法在逐行存储的IP列表中命中任意单个IP。
要实现真正的“批量搜索”,需将输入拆分为独立IP项,对每个有效IP分别执行精确匹配(推荐使用行首行尾锚定 + 字面量匹配),而非拼接成复杂模式。以下是优化后的完整解决方案:
<?php if ($_POST && !empty(trim($_POST['q']))) { $file = 'check.txt'; $contents = file_get_contents($file); if ($contents === false) { echo "错误:无法读取文件 '$file'。"; exit; } // 按换行、空格、制表符等空白字符分割输入,并过滤空项 $ipList = array_filter(array_map('trim', preg_split('/s+/', $_POST['q'])), 'strlen'); $found = []; foreach ($ipList as $ip) { // 对每个IP进行严格行匹配:^IP$(防止192.168.1.1匹配到192.168.1.11) $escapedIp = preg_quote($ip, '/'); $pattern = '/^' . $escapedIp . '$/m'; if (preg_match($pattern, $contents)) { $found[] = $ip; } } // 去重并输出结果(保留原始输入顺序,自动去重) $uniqueFound = array_values(array_unique($found)); if (!empty($uniqueFound)) { echo "<pre>" . implode("n", $uniqueFound) . "</pre>"; } else { echo "未找到匹配的IP地址。"; }} ?>
关键改进说明:
✅ 正确拆分输入:使用 preg_split('/s+/', ...) 统一处理换行、空格、制表符等分隔符,避免因格式差异导致漏匹配;
✅ 逐IP精确匹配:每个IP单独构造 ^IP$ 正则,确保只匹配整行内容,杜绝子串误匹配;
✅ 安全转义:preg_quote() 防止用户输入特殊正则字符(如 .、*)引发语法错误或注入风险;
✅ 结果去重与格式化:array_unique() 消除重复查询项,<pre> 标签保持换行可读性;
✅ 健壮性增强:添加文件读取失败检查、空输入校验,提升用户体验与容错能力。
注意事项:
- 确保 check.txt 文件编码为 UTF-8 且每行仅含一个标准IPv4地址(无多余空格);
- 若需支持IPv6或更复杂的IP验证(如范围校验),建议引入 filter_var($ip, FILTER_VALIDATE_IP) 预校验;
- 对于超大文件(>10MB),应改用逐行扫描(fgets())避免内存溢出,本例适用于中小规模IP库。
通过以上重构,用户可在文本域中自由输入多IP(换行、空格、逗号分隔均可),系统将高效、准确返回所有存在于文件中的匹配项。
立即学习“PHP免费学习笔记(深入)”;
相关文章
- 逆战未来枪械大全 逆战未来枪械稀有度等级与获取方式详解 07-19
- 逆战未来新手攻略 逆战未来萌新入门避坑指南 07-19
- "无醇啤酒"是完全不含酒精吗 蚂蚁庄园1月17日答案早知道 07-19
- "太常寺"是古代掌管什么事务的机构 蚂蚁新村1月16日答案 07-19
- 四川名菜"开水白菜"就是用开水炖白菜吗 蚂蚁庄园1月17日答案早知道 07-19
- 蚂蚁新村今天正确答案1.16 07-19