
本文介绍如何修改php脚本,使其支持在txt文件中批量匹配多个ip地址(以换行或空格分隔),解决单ip可查、多ip失效的问题,并提供健壮的正则匹配与结果去重方案。
本文介绍如何修改php脚本,使其支持在txt文件中批量匹配多个ip地址(以换行或空格分隔),解决单ip可查、多ip失效的问题,并提供健壮的正则匹配与结果去重方案。
原始代码的核心问题在于:它将整个文本域($_POST['q'])作为单一搜索模式,直接用于正则匹配。当用户输入多个IP(如 127.0.0.1\n44.222.223.22)时,$find 变量包含换行符和空白,而 $pattern 被构造成一个试图完整匹配含换行的字符串的正则(例如 /^.*127.0.0.1\n44.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 class="brush:php;toolbar:false;">" . implode("\n", $uniqueFound) . "";
} else {
echo "未找到匹配的IP地址。";
}
} ?>关键改进说明:
✅ 正确拆分输入:使用 preg_split('/\s+/', ...) 统一处理换行、空格、制表符等分隔符,避免因格式差异导致漏匹配;
✅ 逐IP精确匹配:每个IP单独构造 ^IP$ 正则,确保只匹配整行内容,杜绝子串误匹配;
✅ 安全转义:preg_quote() 防止用户输入特殊正则字符(如 .、*)引发语法错误或注入风险;
✅ 结果去重与格式化:array_unique() 消除重复查询项,
标签保持换行可读性;<br> ✅ <strong>健壮性增强</strong>:添加文件读取失败检查、空输入校验,提升用户体验与容错能力。<p><strong>注意事项:</strong> </p>
- 确保 check.txt 文件编码为 UTF-8 且每行仅含一个标准IPv4地址(无多余空格);
- 若需支持IPv6或更复杂的IP验证(如范围校验),建议引入 filter_var($ip, FILTER_VALIDATE_IP) 预校验;
- 对于超大文件(>10MB),应改用逐行扫描(fgets())避免内存溢出,本例适用于中小规模IP库。
通过以上重构,用户可在文本域中自由输入多IP(换行、空格、逗号分隔均可),系统将高效、准确返回所有存在于文件中的匹配项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











