
本文介绍如何使用 php 读取多个纯文本文件(如 name.txt、cardnumber.txt、expirydate.txt),将每行转为数组,并根据用户提交的姓名精准匹配对应行索引,从而同步输出其他文件中同位置的卡号、有效期等信息,同时解决因换行符导致的字符串比对失败问题。
本文介绍如何使用 php 读取多个纯文本文件(如 name.txt、cardnumber.txt、expirydate.txt),将每行转为数组,并根据用户提交的姓名精准匹配对应行索引,从而同步输出其他文件中同位置的卡号、有效期等信息,同时解决因换行符导致的字符串比对失败问题。
在 PHP 中处理多文件行列对齐式数据时,一个常见误区是直接用 file() 函数读取文本文件后进行 == 字符串比较——这会导致匹配失败。原因在于 file() 默认保留每行末尾的换行符(\n 或 \r\n),而用户输入(如表单提交的 "Jane Doe")不含该字符,因此 "$point == $search" 永远为 false。
✅ 正确做法是:对 file() 返回的每一行使用 trim() 去除首尾空白(包括换行符),再与用户输入进行严格比较。
以下是优化后的完整实现(含 HTML 表单与 PHP 处理逻辑):
<!DOCTYPE html>
<html>
<head><title>Name Search</title></head>
<body>
<form method="POST" class="form">
<h2>Name:</h2><br>
<input type="text" class="name" name="name" id="name" required><br>
<input type="submit" name="submit" id="submit" value="Search">
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['name'])) {
$search = trim($_POST['name']); // 防止用户误输空格
// 读取三份文件,每行作为数组元素
$nameFile = file('name.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$cardNumberFile = file('cardnumber.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$expiryDateFile = file('expirydate.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 确保三文件行数一致(关键前提!)
$lineCount = count($nameFile);
if ($lineCount !== count($cardNumberFile) || $lineCount !== count($expiryDateFile)) {
echo '<p style="color:red;">Error: Files must have identical number of lines.</p>';
exit;
}
$found = false;
for ($i = 0; $i < $lineCount; $i++) {
if ($nameFile[$i] === $search) {
$found = true;
?>
<div class="card">
<img src="images/img.png" alt="Card image">
<h2 class="cardname"><?php echo htmlspecialchars($nameFile[$i]); ?></h2>
<h2 class="cardnumber"><?php echo htmlspecialchars($cardNumberFile[$i]); ?></h2>
<h2 class="expirydate"><?php echo htmlspecialchars($expiryDateFile[$i]); ?></h2>
</div>
<?php
break; // 找到即停,避免重复输出
}
}
if (!$found) {
echo '<p>No match found for "<strong>' . htmlspecialchars($search) . '</strong>".</p>';
}
}
?>
</body>
</html>? 关键改进说明:
立即学习“PHP免费学习笔记(深入)”;
- 使用 FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES 标志调用 file(),从源头避免换行符干扰,比手动 trim() 更高效可靠;
- 采用 for 循环替代 while + current/next,语义清晰、索引明确、不易出错;
- 添加文件行数一致性校验,防止因数据错位导致越界或错配;
- 对所有输出内容使用 htmlspecialchars(),防止 XSS 攻击;
- 表单增加 required 属性,并对 $_POST['name'] 做空值判断,提升健壮性。
⚠️ 注意事项:
- 此方案依赖严格的「行列对齐」结构——三文件第 n 行必须属于同一用户记录;
- 生产环境建议添加错误处理(如 file_exists() 检查、权限验证);
- 若数据量较大(>1000 行),可考虑一次性加载后构建关联数组(如 ['John Doe' => ['card'=>'...', 'expiry'=>'...']]),提升后续查询性能;
- 图片路径 images/img.png 需确保实际存在,否则仅显示占位符。
该方法完全满足“禁用数据库、仅用文件+数组”的约束,兼顾安全性、可读性与实用性,是轻量级静态数据关联查询的典型实践。



















