4

重複の可能性:
ネストされたパターンの照合に正規表現を使用できますか?

次のような文字列があります。

$string = "Hustlin' ((Remix) Album Version (Explicit))";

基本的に、括弧内のすべてを削除したいと思います。上記のネストされた括弧の場合、最上位でそれを削除したいだけです。

だから私は結果がちょうどあると期待しています"Hustlin' "

私は次のことを試しました:

preg_replace("/\(.*?\)/", '', $string);|

次の奇数の結果を返します"Hustlin' Album Version )"

誰かがここで何が起こったのか説明できますか?

4

3 に答える 3

10

あなたのパターン\(.*?\)はaに一致し(、最初の(そしてその間のすべて)を見つけます):パターンはバランスの取れた括弧に一致することをどのように「理解」しますか?

ただし、PHPの再帰パターンを利用することはできます。

$string = "Hustlin' ((Remix) Album Version (Explicit)) with (a(bbb(ccc)b)a) speed!";
echo preg_replace("/\(([^()]|(?R))*\)/", "", $string) . "\n";

印刷します:

スピードのあるハスリン!

パターンの簡単な内訳:

\(         # match a '('
(          # start match group 1
  [^()]    #   any char except '(' and ')'
  |        #   OR
  (?R)     #   match the entire pattern recursively
)*         # end match group 1 and repeat it zero or more times
\)         # match a ')'
于 2012-10-06T19:17:16.603 に答える
0

内部に正規表現の置換を含む単純なループを作成します。

の最初の出現のみを置換

/\([^()]*\)/

空の文字列で、一致が見つからなくなるまでそれを繰り返します。

于 2012-10-06T19:01:16.340 に答える
0

あなたの質問に答えるには:あなたの正規表現を使用したステートメントは、括弧preg_replace シーケンスの最初の出現とその中のすべてを一致させて削除します-別の開き括弧が発生しても関係ありません。

于 2012-10-06T19:12:09.537 に答える