4

現在、次のような状況になっています。テキストを「解析」してプレースホルダーを探し(表記は「{...}」)、後で実際のテキストに置き換えます。

正規表現について考えました

$foo = "Hello World {foo{bar}} World Hello!";
$bar = array();
preg_match_all('@\{.+\}@U', $foo, $bar);
var_dump($bar);

しかし、これは戻ります

array(1) { [0]=> array(1) { [0]=> string(9) "{foo{bar}" } }

貪欲にすると、次のようになります。

array(1) { [0]=> array(1) { [0]=> string(10) "{foo{bar}}" } }

しかし、私は結果が次のようになることを望んでいます:

array(1) { [0]=> array(2) { [0]=> string(5) "{bar}" [1]=> string(10) "{foo{bar}}" } }

preg_match(_all)と正規表現を使用してこれに到達する方法はありますか?

または、結果セットにサブステートメントがなくなるまで、$ barを何度もループする必要がありますか?

4

1 に答える 1

3

このためのPCREを持っているのは幸運です。これは、再帰を使用して解決する必要があります:http: //regex101.com/r/pO3hA0

/(?=({(?>[^{}]|(?1))+}))/g(phpではgフラグは必要ありません)

于 2012-09-03T09:03:12.670 に答える