0

次のテキストから 3 つのグループを作成する必要があります。

[startA]
this is the first group
 [startB]
 blabla
[end]
[end]
[startA]
this is the second group
 [startB]
 blabla
[end]
[end]
[startA]
this is the second group
 [startB]
 blabla
[end]
[end]

ご覧のとおり、各グループは で始まり で[startA]終わり[end]ます。これに一致する正規表現を作成するのは簡単なはずです。
しかし問題は、グループ内で文字列[end]が任意の回数使用されることです。正規表現は、前のではなく、次の直前の直前で開始および終了
するグループと一致する必要があります。[startA][end][startA][end]

先読みで行うべきだと思いますが、これまでのところ、私の試みはどれもうまくいきませんでした。
正規表現でこれを行うことは可能ですか?

4

2 に答える 2

1

再帰的な正規表現パターンを使用する必要があります

preg_match_all('/\[(?!end)[^[\]]+\](?:[^[\]]*|[^[\]]*(?R)[^[\]]*)\[end\]\s*/', $s, $m);

このデモを参照してください。

于 2012-11-24T15:15:18.067 に答える
0

はい、あなたは確かに先読みでこれを解決するかもしれません:

$test_string = <<<TEST
[startA]
this is the first group
 [startB]
 blabla
[end]
[end]
[startA]
this is the second group
 [startB]
 blabla
[end]
[end]
[startA]
this is the third group
 [startB]
 blabla
[end]
[end]
TEST;
preg_match_all('#\[startA](.+?)\[end]\s*(?=\[startA]|$)#s', 
    $test_string, $matches);
var_dump($matches[1]);

これがideoneのデモです。

重要なのは、先読みサブパターンで交互を使用して、次の[startA]セクションまたは文字列の終わり($)をテストすることです。

/s修飾子に注意してください。これがないと、.メタ文字はエンドライン( "\ n")と一致しません。

于 2012-11-24T13:55:19.777 に答える