[古い回答]
必要に応じて、ネストされた括弧と角括弧または中括弧を処理できるパターン:
$pattern = '~(?:(\()|(\[)|(\{))(?(1)(?>[^()]++|(?R))*\))(?(2)(?>[^][]++|(?R))*\])(?(3)(?>[^{}]++|(?R))*\})~';
$result = preg_replace($pattern, '', $str);
[編集]
バランスの取れた部分のみを削除し、3 種類の括弧を考慮したパターン:
$pattern = '~
\[ [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ ]
|
\( [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ \)
|
{ [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ }
~xS';
このパターンはうまく機能しますが、目的が文字列内のブラケット部分を削除することだけである場合、追加の型チェックは少しやり過ぎです。ただし、すべての種類のブラケットが文字列内でバランスが取れているかどうかを確認するサブパターンとして使用できます。
バランスの取れた部分のみを削除するパターンですが、今回は最も外側のタイプのブラケットのみが考慮され、内側の他のタイプのブラケットは無視されます(以前の回答と同じ動作ですが、より効率的で、役に立たない条件テストはありません) :
$pattern = '~
\[ ( [^][]*+ (?: \[ (?1) ] [^][]* )*+ ) ]
|
\( ( [^)(]*+ (?: \( (?2) ] [^)(]* )*+ ) \)
|
{ ( [^}{]*+ (?: { (?3) } [^}{]* )*+ ) }
~xS';