5

削除したい中かっこで囲まれたいくつかの文で構成される文字列があります。それを行うのはそれほど難しいことではありませんが (私が今知っているように)、本当の問題はそれがマルチレベルであり、私が削除したいのは最上位のブラケットだけであり、内部のすべてをそのままにしておくことです。次のようになります。

{Super duper {extra} text.} {Which I'm really {starting to} hate!} {But I {won't give up} so {easy}!} {Especially when someone is {gonna help me}.}

これらの 4 つのエントリで構成される配列を作成したいと考えています。

Super duper {extra} text.
Which I'm really {starting to} hate!
But I {won't give up} so {easy}!
Especially when someone is {gonna help me}.

私は2つの方法を試しました.1つはpreg_splitで、あまりうまくいきませんでした:

$key = preg_split('/([!?.]{1,3}\} \{)/',$key, -1, PREG_SPLIT_DELIM_CAPTURE);
$sentences = array();

for ($i=0, $n=count($key)-1; $i<$n; $i+=2) {
$sentences[] = $key[$i].$key[$i+1]."<br><br>";
}

もう 1 つは、preg_match_all を使用していました。これは、これらのブラケットがマルチレベルであることに気付くまでは非常に優れていました。

$matches = array();
$key = preg_match_all('/\{[^}]+\}/', $key, $matches);
$key = $matches[0];

前もって感謝します!:)

4

2 に答える 2

5

次のような再帰式を使用できます。

/{((?:[^{}]++|(?R))*+)}/

望ましい結果は、最初のキャプチャ グループにあります。

使用法、次のようなもの:

preg_match_all('/{((?:[^{}]++|(?R))*+)}/', $str, $matches);
$result = $matches[1];
于 2012-06-13T22:58:53.483 に答える
4
$x="foo {bar {baz}} whee";
$re="/(^[^{]*){(.*)}([^}]*)$/";
print preg_replace($re, "\\1\\2\\3", $x) . "\n";'

戻り値:

foo bar {baz} whee
于 2012-06-13T23:01:15.527 に答える