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

3

[古い回答]

必要に応じて、ネストされた括弧と角括弧または中括弧を処理できるパターン:

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

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

[編集]

バランスの取れた部分のみを削除し、3 種類の括弧を考慮したパターン:

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

このパターンはうまく機能しますが、目的が文字列内のブラケット部分を削除することだけである場合、追加の型チェックは少しやり過ぎです。ただし、すべての種類のブラケットが文字列内でバランスが取れているかどうかを確認するサブパターンとして使用できます。


バランスの取れた部分のみを削除するパターンですが、今回は最も外側のタイプのブラケットのみが考慮され、内側の他のタイプのブラケットは無視されます(以前の回答と同じ動作ですが、より効率的で、役に立たない条件テストはありません) :

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