2014-03-10 2 views
1

Мой текстовый файл:Как читать из текстового файла до тех пор, пока строка не будет найдена и не будет удалена, пока не будет найдена следующая конкретная строка?

;=-= title1-id1 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title1-id1 =-=; 

;=-= title2-id2 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title2-id2 =-=; 

Мне нужно прочитать этот файл и удалить содержимое, я хочу, например: от ;=-= title2-id2 =-=; до ;=-= end-title2-id2 =-=;

+0

Всегда тот же формат даты? – mariotanenbaum

+0

Насколько велик файл? Если он всегда будет относительно небольшим, возможно, вам лучше всего это прочитать в строке, сделайте очистку и запишите его обратно в файл. – Gil

+0

@mariotanenbaum, на какую дату вы смотрите? Я не вижу никаких дат. – Mike

ответ

1

Что вы цель? и спросите себя, есть ли у меня какое-либо другое решение для его достижения. , кстати, использование файлов не является правильным способом, если вы спросите меня, & у вас не так много вариантов. В этом файле вы можете выполнить поиск части содержимого вашего файла, а затем после отправки, результат поиска будет удален.

<form action="" method="post"> 
<input type="text" name="search"> 
<input type="submit" name="searching"> 
<p> 
    for example= insert "zzzzzzzzzzzz" 
</p> 
</form> 

<?php 
if(isset($_POST['searching'])) 
{ 
$file = 'test.txt'; 
$searchfor = $_POST['search']; 

$contents = file_get_contents($file); 
$pattern = preg_quote($searchfor, '/'); 
$pattern = "/^.*$pattern.*\$/m"; 
if(preg_match_all($pattern, $contents, $matches)) 
{ 
    $action = str_replace($searchfor, '', $contents); 
    file_put_contents($file, $action); 
} 
} 
1

file_get_contents получает весь файл, поэтому его заполняет память.
Я быстро придумал что-то вроде этого.

$myArray = array(); 
$file = "file.txt"; 
$bytesStreamed = 1024; //max line length times 8 
$tempString = ""; 
$iterator = 1; 
$readCode = true; 

if($stream = fopen($file, 'r')) { 
    //stream_get_contents gets only few bytes of the file so does not use up all the memory for big files 
    while($streamKiloByte = stream_get_contents($stream, $bytesStreamed)) { 
     $temp = explode("\n", $tempString.$streamKiloByte); 
     $tempString = ""; 
     for($i = 0; $i<(count($temp)-1); $i++){ 
      if($i==0) { 
       //last element can be partial, lets keep it 
       $tempString = $temp[count($temp)-1]; 
      } else { 
       array_push($myArray, $temp[$i-1]); 
      } 
     } 
     while(count($myArray)){ 
      foreach($myArray AS $whatEver){ 
       $firstElementOfArray = array_shift($myArray); 
       $f =& $firstElementOfArray; 
       if($f!="\r"){ 
        if($f ==";=-= title{$iterator}-id{$iterator} =-=;\r"){ 
         //the useless code started 
         $readCode = false; 
        } else if ($f == ";=-= end-title{$iterator}-id{$iterator} =-=;\r" || $f == ";=-= end-title{$iterator}-id{$iterator} =-=;"){ 
         //the useless code ended, preapered for next block 
         $readCode = true; 
         $iterator++; 
        } else { 
         if($readCode){ 
          //THE CODE 
          echo $f; 
         } else { 
          //the useless code 
         } 
        } 
       } 
      } 
     } 
    } 
    fclose($stream); 
} 

использовал его на файл:

;=-= title1-id1 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title1-id1 =-=; 

THE CODE 1 

;=-= title2-id2 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title2-id2 =-=; 

THE CODE 2 

;=-= title3-id3 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title3-id3 =-=; 

THE CODE 3 

;=-= title4-id4 =-=; 
zzzzzzzzzzzz 
xzqwnqrj90x9 
n9ndfpo-f,m129 
mf20fmf2-m, 
;=-= end-title4-id4 =-=; 

Имел resoult:

THE CODE 1THE CODE 2THE CODE 3 

P.S. Поток КОДА в файл, чтобы он взял память.

+0

hmmm, он не работает для меня ( – Temwanjera

+0

он просто удаляет последнюю строку, но Мне нужно удалить все строки между ними с так называемыми «тегами»:; = = = title2-id2 = - =; до; = - = end-title2-id2 = - =; – Temwanjera

+0

Является ли тело блока всегда длиной 4 строки «Что вы хотите делать с блочным контентом? – Ganu

1

Я сделал свой собственный сценарий, но я боюсь, что это нуждается в оптимизации ... Однако она отлично работает:

<?php 
$filename = 'file.txt'; 
$fisttag = ';=-= title2-id2 =-=;'; 
$lasttag = ';=-= end-title2-id2 =-=;'; 
// Open the file 
$fp = @fopen($filename, 'r'); 

// Add each line to an array 
if ($fp) { 
    $array = explode("\n", fread($fp, filesize($filename))); 
} 

$i=0; 
$f = 0; 
$newcont = ""; 
$blp = 0; 

while(isset($array[$i])) 
{ 
    //if(($array[$i]=="\n")and($array[$i+1]=="\n")){$blp=1;die($blp);} 
    if($array[$i]==$fisttag){ $f=1; } 
    if($f==1){ if($array[$i]==$lasttag){ $f=0; } } 
    if(($f!=1)and($array[$i]!=$lasttag)) 
    { 
    if($i>0 and ($array[$i-1]==$lasttag)){ $blp=1; } 
    if($blp!=1){$newcont .= $array[$i]."<br />";} 
    else $blp = 0; 

    } 
    $i++; 
} 

echo $newcont; 
?> 
Смежные вопросы

 Смежные вопросы