如何使用PHP删除文本文件中的多行(序列)?

时间:2017-09-15 08:10:15

标签: php

我有这样的文本文件。

;[Teca-E1]
context=TRK_E0_TDM1
channel=17-31
context=TRK3
group=0
channel=1-15
group=3
;cgoi=15v15r
;status=
;[Teca-E1]
context=TRK_E1_TDM2
channel=48-62
context=TRK3
group=1
channel=32-46
group=3
;cgoi=15v15r
;status=
;[Teca-E1]
context=TRK_E2_TDM3
channel=79-93
context=TRK3
group=2
channel=63-77
group=3
;cgoi=15v15r
;status=

我想删除8行以此行开头“context = TRK_E0_TDM”。

我想要的结果是:

;[Teca-E1]
context=TRK_E1_TDM2
channel=48-62
context=TRK3
group=1
channel=32-46
group=3
;cgoi=15v15r
;status=
;[Teca-E1]
context=TRK_E2_TDM3
channel=79-93
context=TRK3
group=2
channel=63-77
group=3
;cgoi=15v15r
;status=

为了便于拍摄,我在下面有一张照片: enter image description here

我编写了PHP代码,它可以删除特定的行,但我不知道如何删除特定的组。

这意味着:

  • 我想删除第1组并保留第2组和第3组

  • 或者我想删除第2组并保留第1组和第3组

  • 或者我想删除第3组并保留第1组和第2组

提前致谢。

这是我的PHP代码:

<?php
$f = "trunk_e1.txt";

$term = "context=TRK_E0_TDM";

$arr = file($f);

foreach ($arr as $key=> $line) {

    //removing the line
    if(stristr($line,$term)!== false){
        unset($arr[$key]);
        break;
    }
}

//reindexing array
$arr = array_values($arr);

//writing to file
file_put_contents($f, implode($arr));
?>

1 个答案:

答案 0 :(得分:0)

preg_replace函数的简短解决方案:

$data = file_get_contents('trunk_e1.txt');
$result = preg_replace('/^.*context=TRK_E0_TDM.*(?=;\[Teca\-E1\]\s*context=TRK_E1_TDM2)/s', '', $data);
file_put_contents('trunk_e1.txt', $result);

最终trunk_e1.txt内容:

;[Teca-E1]
context=TRK_E1_TDM2
channel=48-62
context=TRK3
group=1
channel=32-46
group=3
;cgoi=15v15r
;status=
;[Teca-E1]
context=TRK_E2_TDM3
channel=79-93
context=TRK3
group=2
channel=63-77
group=3
;cgoi=15v15r
;status=

Bonus 动态删除的扩展解决方案:

$data = file_get_contents('empty.txt');
$group_id = 1;   // from 0 to ...
$pat = '/^(.*);\[Teca\-E1\]\s*context=TRK_E'. $group_id. '_TDM.*?(?=;\[Teca\-E1\]\s*context=TRK_|$)/s';
$result = preg_replace($pat, '$1', $data);
file_put_contents('empty.txt', $result);