PHP实现逐行清除文本文件中与指定值不匹配的行
实现PHP逐行过滤文本文件中不匹配指定值的行
首先得感谢Prashant Pokhriyal、Steve、Ulrich Eckhardt三位朋友的评论反馈!之前我发的问题里,原本分行写的内容被合并成一行了,我已经把问题重新编辑修正啦。
先给大家看看我用的测试文本文件test.txt的内容:
115.5.108.249 2015-03-01 118.110.6.87 2018-01-03 36.120.105.13 2018-04-06
目前我已经有了一段PHP代码的雏形:
<?php $fname = "test.txt"; $date = date("Y-m-d"); foreach($lines as $line) if(!strstr($line, $date)) $out .= $line; $f = fopen($fname, ...
现在我需要完成的功能是:用PHP逐行清除文本文件中与指定值不匹配的行——说白了就是只保留包含指定值的行,把其他行删掉。下面给大家分享完整的实现方案:
基础实现方案(适合小文件)
如果你的文件不大,用file()函数一次性读取所有行是最方便的,代码逻辑清晰易懂:
<?php $fname = "test.txt"; // 这里可以替换成你需要匹配的任意值,比如固定日期"2018-01-03" $matchValue = date("Y-m-d"); // 读取文件所有行,FILE_IGNORE_NEW_LINES参数会去掉每行末尾的换行符,方便后续处理 $lines = file($fname, FILE_IGNORE_NEW_LINES); $filteredContent = ''; foreach($lines as $line) { // 这里判断:如果行里包含指定值,就保留它 // 要是你想反过来——清除匹配的行,就改成!str_contains($line, $matchValue) if(str_contains($line, $matchValue)) { $filteredContent .= $line . PHP_EOL; // 添加换行符,保持文件原有格式 } } // 以"w"模式打开文件,这个模式会清空原有内容,然后写入筛选后的内容 $fileHandle = fopen($fname, "w"); fwrite($fileHandle, $filteredContent); fclose($fileHandle); echo "文件处理完成!"; ?>
小提示
- PHP 8.0及以上版本推荐用
str_contains(),语义更明确;如果是低版本PHP,继续用strstr()完全没问题 - 要确保服务器对
test.txt文件有读写权限,不然会报错哦
进阶实现方案(适合大文件)
如果你的文件特别大,一次性读取所有行可能会占用过多内存,这时候就需要逐行读取处理,用临时文件过渡:
<?php $fname = "test.txt"; $matchValue = date("Y-m-d"); // 创建一个临时文件,用来存放筛选后的内容 $tempFile = tempnam(sys_get_temp_dir(), 'file_filter'); // 打开原文件(只读模式)和临时文件(写入模式) $originalFile = fopen($fname, "r"); $tempHandle = fopen($tempFile, "w"); // 逐行读取原文件 while(($line = fgets($originalFile)) !== false) { // 判断当前行是否包含指定值,是就写入临时文件 if(str_contains($line, $matchValue)) { fwrite($tempHandle, $line); } } // 关闭所有文件指针 fclose($originalFile); fclose($tempHandle); // 用临时文件替换原文件 rename($tempFile, $fname); echo "大文件处理完成!"; ?>
这种方法不会一次性加载整个文件到内存,处理超大文件时更稳定。
内容的提问来源于stack exchange,提问作者dani yal
相关产品推荐
相关产品推荐

