[老答案]
如果需要,可以处理嵌套括号和方括号或大括号的模式:
$pattern = '~(?:(\()|(\[)|(\{))(?(1)(?>[^()]++|(?R))*\))(?(2)(?>[^][]++|(?R))*\])(?(3)(?>[^{}]++|(?R))*\})~';
$result = preg_replace($pattern, '', $str);
[编辑]
仅删除平衡良好的部分并考虑三种括号的模式:
$pattern = '~
\[ [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ ]
|
\( [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ \)
|
{ [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ }
~xS';
这种模式效果很好,但是当目标只是删除字符串中的括号部分时,额外的类型检查有点矫枉过正。但是,它可以用作子模式来检查字符串中所有类型的括号是否平衡。
只删除平衡良好的部分的模式,但这次只考虑最外面的括号类型,内部的其他类型的括号被忽略(与旧答案相同的行为,但更有效且没有无用的条件测试):
$pattern = '~
\[ ( [^][]*+ (?: \[ (?1) ] [^][]* )*+ ) ]
|
\( ( [^)(]*+ (?: \( (?2) ] [^)(]* )*+ ) \)
|
{ ( [^}{]*+ (?: { (?3) } [^}{]* )*+ ) }
~xS';