我正在制作一个逐行读取文件的程序并删除说Hand #[any numbers]
$file_name = 'the_file.txt';
$file_handle = fopen($file_name,"r+");
while(! feof($file_handle)) {
$file = fgets($file_handle);
if (preg_match("/^(Hand\s#\d+)/m", $file)) {
fwrite($file_handle, preg_replace("/^(Hand\s#\d+)/m", "", $file));
}
}
fclose($file_handle);
此代码不执行任何操作,但是如果放echo $file . '<br />';
它会打印Hand #[any numbers]
的每一行所以认为它是fwrite($file_handle, preg_replace("/^(Hand\s#\d+)/m", "", $file));
的问题如果文件没有逐行读取,那么它可以正常工作
答案 0 :(得分:1)
尝试写入与您正在阅读的文件不同的文件。 PHP可能不会因为您正在尝试覆盖文件的某些部分而感到不适。
同时仔细检查PHP脚本是否有权写入文件。尝试一些简单的事情,例如备份它,然后执行file_put_contents($file_name, 'test');
答案 1 :(得分:0)
它可能与文件指针位置有关,也与您正在写入文件而不删除任何内容有关。请参阅函数http://us.php.net/manual/en/function.fseek.php
所以你不是删除一行,而是在你刚读完的那一行之后的地方写一个新行(留在原处)。在这种情况下,最好在不同的文件中写入。
答案 2 :(得分:0)
您想要排除以“Hands #number”开头的所有行吗? 那你为什么要使用preg_match来找到这些行,把它们写成什么代替文件呢?只需排除它们并在数组中保留所需的行。或者打开辅助文件并将每行直接写入新文件,如果内存限制是个问题。
$filename = "the_file.txt";
$handle = fopen($filename, "r+") or die("Could not open $filename" . PHP_EOL);
$keep = array();
while(!feof($handle)) {
$line = fgets($handle);
if(!preg_match("/^(Hand\s#\d+)/m", $line)) {
$keep[] = $line;
}
}
rewind($handle);
fwrite($handle, implode(PHP_EOL, $keep));
fclose($handle);