Rimozione di parentesi nidificate mediante regex in PHP

Possibile duplicato:
Le espressioni regolari possono essere utilizzate per abbinare i templates annidati?

Ho una string come questa:

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

e voglio sostanzialmente rimuovere tutto tra parentesi. Nel caso precedente con parentesi annidate, voglio rimuoverlo al livello più alto.

Quindi mi aspetto che il risultato sia semplicemente "Hustlin' " .

Ho provato il seguente:

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

che restituisce il risultato dispari di: "Hustlin' Album Version )" .

Qualcuno può spiegare cosa è successo qui?

Il tuo pattern \(.*?\) Corrisponde a ( e quindi troverà il primo ) (e tutto ciò che sta in mezzo): in che modo il pattern "capirà" per corrispondere alla parentesi bilanciata?

Tuttavia, puoi utilizzare il model ricorsivo di PHP:

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

stamperebbe:

  Hustlin 'con velocità! 

Una breve interruzione del model:

 \( # 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 ')' 

Per rispondere alla tua domanda: la tua istruzione regex che utilizza preg_replace corrisponde e rimuove la prima occorrenza di una sequenza di parasteiche e tutto ciò che si trova all'interno di essa , indipendentemente dal fatto che si verifichi un'altra parentesi di apertura.

Crea un ciclo semplice con la regex sostitutiva all'interno.

Sostituisci solo la prima occorrenza di

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

con una string vuota e ripetere ciò fino a quando non viene trovata alcuna corrispondenza.