PHP读取txt文件执行搜索时如何让逻辑包含首行内容
问题原因
- PHP内置的
file()函数默认会保留每行末尾的换行符,你仅对用户输入的$name做了trim处理,未对读取到的文件行内容做去换行、去首尾空白处理,导致首行分割出的第一个字段末尾携带隐藏换行符,无法和$name匹配成功。 - 若你的txt文件为带BOM头的UTF-8编码,首行开头会存在3个不可见的BOM字符,也会导致首行匹配失败。
修复方案
- 调用
file()时添加FILE_IGNORE_NEW_LINES参数,自动移除每行末尾的换行符,可选添加FILE_SKIP_EMPTY_LINES跳过文件内的空行,避免后续分割报错。 - 对读取到的每一行内容做trim处理,和
$name的处理逻辑对齐,避免首尾空白字符影响匹配。 - 兼容处理UTF-8 BOM头的情况,如果使用的PHP版本低于8.0,可将BOM头判断逻辑替换为
substr($line, 0, 3) === "\xef\xbb\xbf"实现兼容。
修复后参考代码
$name = trim($_GET['name']); // 加参数移除换行、跳过空行 $file = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $found = 0; $t1 = $t2 = ''; // 提前统计行数,避免循环中重复计算提升性能 $lineCount = count($file); for($i = 0; $i < $lineCount; $i++){ $line = $file[$i]; // 处理首行UTF-8 BOM头 if($i === 0 && str_starts_with($line, "\xef\xbb\xbf")){ $line = substr($line, 3); } // 对行内容做trim,和$name处理逻辑对齐 $read = explode('|', trim($line)); // 加判断避免数组越界报错 if(count($read) < 2) continue; if($name == $read[0]){ $found = 1; $t1 = $read[0]; $t2 = $read[1]; // 匹配到可提前跳出循环 break; } }
内容的提问来源于stack exchange,提问作者user6871473
相关产品推荐
相关产品推荐

