一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何在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免费学习笔记(深入)”;

热门栏目