这是我的解决方案:
逐行执行此操作有点困难,但它确实可以让您更好地管理大文件的内存,因为您不会一次打开整个文件。您也可以通过这种方式更轻松地替换多个块。
$file = 'test.txt';
//open file to read from
$f = fopen(__DIR__.DIRECTORY_SEPARATOR.$file,'r');
//open file to write to
$w = fopen(__DIR__.DIRECTORY_SEPARATOR.'out-'.$file,'w');
$state = 'start'; //start, middle, end
//start - write while looking for a start tag ( set to middle )
//middle - skip while looking for end tag ( set to end )
//end - skip while empty ( set to start when not )
//Tags
$start = ['#start-second'];
$end = ['#end-second'];
//read each line from the file
while( $line = fgets($f)){
if( $state == 'end' && !empty(trim($line))){
//set to start on first non empty line after tag
$state = 'start';
}
if( $state == 'start' ){
if(in_array(trim($line),$start)){
$state = 'middle';
}else{
fwrite($w, $line);
}
}else if( $state == 'middle' ){
if(in_array(trim($line),$end)){
$state = 'end';
}
}
}
//close both files
fclose($f);
fclose($w);
//delete the input file
//unlink(__DIR__.DIRECTORY_SEPARATOR.$file);
//for debugging only
echo "<pre>";
echo file_get_contents(__DIR__.DIRECTORY_SEPARATOR.'out-'.$file)
还有输出
#start-first
Line 1
Line 2
Line 3
#end-first
#start-n
Line 1
Line 2
Line 3
Line 4
...
...
#end-n
这也将接受一组标签,因此您可以每次删除多个块。
出于安全原因,大多数 PHP 沙箱(或一般的代码沙箱)会阻止您使用这些函数。也就是说,在某种程度上,我们可以emulate 代码主体,解析位。这就是我在这里所做的。
http://sandbox.onlinephpfunctions.com/code/0a746fb79041d30fcbddd5bcb00237fcdd8eea2f
这样你就可以尝试几个不同的标签,看看它是如何工作的。为了获得额外的功劳,您可以将其变成一个接受文件路径和一组打开和开始标签的函数。
/**
* @var string $pathName - full path to input file
* @var string $outputName - name of output file
* @var array $tags - array of tags ex. ['start'=>['tag1'],'end'=>[...]]
* @return string - path to output file
*/
function($pathName, $outputName, array $tags){
....
}