7

我想删除大括号内的所有内容。例如,如果字符串是:

[hi] helloz [hello] (hi) {jhihi}

然后,我希望输出仅为helloz.

我正在使用以下代码,但是在我看来应该有更好的方法,是吗?

$name = "[hi] helloz [hello] (hi) {jhihi}";
$new  =  preg_replace("/\([^)]+\)/","",$name); 
$new = preg_replace('/\[.*\]/', '', $new);  
$new = preg_replace('/\{.*\}/', '', $new);  
echo $new;
4

2 回答 2

21

这应该有效:

$name = "[hi] helloz [hello] (hi) {jhihi}";
echo preg_replace('/[\[{\(].*?[\]}\)]/' , '', $name);

将其粘贴到以下位置:http ://writecodeonline.com/php/以查看它是否有效。

于 2013-11-13T08:21:56.257 回答
3

[老答案]

如果需要,可以处理嵌套括号和方括号或大括号的模式:

$pattern = '~(?:(\()|(\[)|(\{))(?(1)(?>[^()]++|(?R))*\))(?(2)(?>[^][]++|(?R))*\])(?(3)(?>[^{}]++|(?R))*\})~';

$result = preg_replace($pattern, '', $str);

[编辑]

仅删除平衡良好的部分并考虑三种括号的模式:

$pattern = '~
    \[ [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+  ]
  |
    \( [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+ \)
  |
    {  [^][}{)(]*+ (?: (?R) [^][}{)(]* )*+  }
~xS';

这种模式效果很好,但是当目标只是删除字符串中的括号部分时,额外的类型检查有点矫枉过正。但是,它可以用作子模式来检查字符串中所有类型的括号是否平衡。


只删除平衡良好的部分的模式,但这次只考虑最外面的括号类型,内部的其他类型的括号被忽略(与旧答案相同的行为,但更有效且没有无用的条件测试)

$pattern = '~
    \[ ( [^][]*+ (?: \[ (?1) ] [^][]* )*+ )  ]
  |
    \( ( [^)(]*+ (?: \( (?2) ] [^)(]* )*+ ) \)
  |
     { ( [^}{]*+ (?:  { (?3) } [^}{]* )*+ )  }
~xS';
于 2013-11-13T09:11:11.210 回答