使用PHP从文本文件中删除文本

3

我将尝试删除文本文件中的一些文本。

文本文件内容如下:

#MESSAGE
:0
* ^(To|cc).*fd.*
|/usr/bin/vacation fd
#monfiltreperso
:0
* ^From.*martial@gironde.com
Maildir/.repertorymoi
#FIN
#monfiltreperso2
:0
* ^Subject:.*monsujet2
Maildir/.repertorymoi2
#FIN
#monfiltreperso3
:0
* ^From.*martial2@gironde.com
Maildir/.repertorymoi2
#FIN

我想删除#monfiltre...#monfiltre...之间的行。

我有以下内容:

$pattern = '~'.'#filtre'.$nom.'\s*\n^#monfiltre~';
$filecontent = preg_replace($pattern, '', $filecontent);

所以我可以删除这行代码:
#monfiltreperso
:0
* ^From.*martial@gironde.com
Maildir/.repertorymoi

但是有一个#FIN没有被删除。

我有:

 #MESSAGE
:0
* ^(To|cc).*fd.*
|/usr/bin/vacation fd
#FIN  (need to be deleted)
:0
* ^Subject:.*monsujet2
Maildir/.repertorymoi2
#FIN

我需要更改这些规则:

$pattern = '~'.'#filtre'.$nom.'\s*\n^#monfiltre~';

但是我找不到如何做到这一点。

2
添加 s 标识符 可能会有所帮助。 - Passerby
2个回答

2

你可以尝试这个:

$pattern = '~#monfiltreperso\s*\n\K.+?(?=#monfiltreperso2)~s';
echo preg_replace($pattern, '', $texte);

如果您确定在#monfiltreperso2之前没有任何#,则可以使用以下内容:

$pattern = '~#monfiltreperso\s*\n\K[^#]++~';

是的,它可以工作,但是 #monfiltreperso 没有被移除。无论我使用另一个 preg_replace 来删除 #monfiltreperso。谢谢 @casimir-et-hippolyte! - mpgn
1
@MartialE:好的!要做到这一点,只需删除\K即可。 - Casimir et Hippolyte
是的,当你发布时我刚好找到了解决方案 ^^ 再次感谢,你让我的一天! :) - mpgn
我修改了主题,你看到了吗?我的问题有点更加复杂。@casimir-et-hippolyte - mpgn

2
如果您想要移除#monfiltre*#FIN之间的部分,可以使用此表达式:
echo preg_replace('/^#monfiltreperso$.+?^#FIN$[\r\n]*/ms', '', $str);

它使用多行模式/m,以便您可以匹配^(行的开头)和$(行的结尾)。要跨多行匹配,您需要点匹配所有模式/s;否则它将匹配到每行的末尾。
还可以匹配一组可选的换行符,以防止空行出现在最终结果中。
如果您想要,也可以使其动态。 表达式可视化
$filter = preg_quote('perso3', '/');
echo preg_replace('/^#monfiltre' . $filter . '$.+?^#FIN$[\r\n]*/ms', '', $str);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接