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

しかし、方法がわかりませんでした。

4

2 に答える 2

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 に答える
2

あなたはこれを試すことができます:

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

または、前に # がないことが確実な場合は#monfiltreperso2、これを使用できます。

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