3

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

texte 文件是这样的:

#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~';

但我没有找到如何。

4

2 回答 2

2

你可以试试这个:

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

或者如果你确定没有任何 # before #monfiltreperso2,你可以使用这个:

$pattern = '~#monfiltreperso\s*\n\K[^#]++~';
于 2013-05-13T10:29:41.997 回答
2

如果要删除#monfiltre*until之间的部分#FIN,可以使用以下表达式:

echo preg_replace('/^#monfiltreperso$.+?^#FIN$[\r\n]*/ms', '', $str);

它使用多行模式/m,以便您可以匹配^(行首)和$(行尾)。要匹配多行,您需要 dot-match-all 模式/s;否则它将匹配到每一行的末尾。

还匹配了一组可选的换行符,以防止空行出现在最终结果中。

表达可视化

如果需要,您可以使其动态化:

$filter = preg_quote('perso3', '/');
echo preg_replace('/^#monfiltre' . $filter . '$.+?^#FIN$[\r\n]*/ms', '', $str);
于 2013-07-09T13:58:39.117 回答