4

私はこの/\(\s*([^)]+?)\s*\)/正規表現を使用して、PHP preg_replace 関数で外側の括弧を削除しています (詳細については、前の質問のRegex to match any character without Trailing Spaces を参照してください)。

これは、ブラケットのペアが 1 つしかない場合は正常に機能しますが、より多くの場合、たとえば、代わりに に( test1 t3() test2)なる場合に問題が発生します。test1 t3( test2)test1 t3() test2

私は正規表現の制限を認識していますが、括弧のペアが複数ある場合、何にも一致しないようにできればいいと思います。

したがって、動作例で十分です。

( test1 test2 )=>test1 test2

( test1 t3() test2 )=>(test1 t3() test2)

編集:

削除されたブラケット内の末尾の空白をトリミングし続けたいと思います。

4

3 に答える 3

3

ネストされた角かっこでも機能する、この再帰的な正規表現ベースのコードを使用できます。唯一の条件は、ブラケットのバランスをとる必要があるということです。

$arr = array('Foo ( test1 test2 )', 'Bar ( test1 t3() test2 )', 'Baz ((("Fdsfds")))');
foreach($arr as $str)
   echo "'$str' => " . 
         preg_replace('/ \( \s* ( ( [^()]*? | (?R) )* ) \s* \) /x', '$1', $str) . "\n";

出力:

'Foo ( test1 test2 )' => 'Foo test1 test2'
'Bar ( test1 t3() test2 )' => 'Bar test1 t3() test2'
'Baz ((("Fdsfds")))' => 'Baz (("Fdsfds"))'
于 2012-05-26T14:32:07.340 に答える
0

これを試して

$result = preg_replace('/\(([^)(]+)\)/', '$1', $subject);

アップデート

\(([^\)\(]+)\)(?=[^\(]+\()

正規表現の説明

"
\(            # Match the character “(” literally
(             # Match the regular expression below and capture its match into backreference number 1
   [^\)\(]       # Match a single character NOT present in the list below
                    # A ) character
                    # A ( character
      +             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
\)            # Match the character “)” literally
(?=           # Assert that the regex below can be matched, starting at this position (positive lookahead)
   [^\(]         # Match any character that is NOT a ( character
      +             # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   \(            # Match the character “(” literally
)
"
于 2012-05-26T12:57:11.940 に答える
0

あなたはこれが欲しいかもしれません(私はそれがあなたがもともと欲しいものだと思います):

$result = preg_replace('/\(\s*(.+)\s*\)/', '$1', $subject);

これは得るでしょう

"(test1 test2)" => "test1 test2"
"(test1 t3() test2)" => "test1 t3() test2"
"( test1 t3(t4) test2)" => "test1 t3(t4) test2"
于 2012-05-26T13:06:52.157 に答える