Codice PHP:
function modifiers($string) {
    if(!
preg_match("#^([+-][0-9]+ \([^)]*\) |[+-][0-9]+ )*([+-][0-9]+ \([^)]*\)$|[+-][0-9]+$)#"$string)){
        
$string="error";
        
$ret=array("sum" => 0"string" => $string);
        return 
$ret;
    }
    
preg_match_all("#[\+-][0-9]+ \([^)]*\)( |$)|[\+-][0-9]+#"$string$matches);
    
$sum=0;
    
$i=0;
    
$string="
Modificatori:
"
;
    for(
$i=0$i<count($matches[0]); $i++){
        
$value=preg_replace("#^([+-][0-9]+)(.*)#""$1"$matches[0][$i]);
        
$sum=$sum+$value;
        
$string=$string.$matches[0][$i]."
"
;
    }
    
$string=$string."Totale: ".$sum;
    
$ret=array("sum" => $sum"string" => $string);
    return 
$ret;    

Questa funzione dovrebbe prendere delle stringhe del tipo:

"+5 (Valore 1) -4 (Valore 2) +1 -7"

restituendo la somma dei valori e questa stringa:
Modificatori:
+5 (Valore 1)
-4 (Valore 2)
+1
-7

Fin qui tutto bene. Però se provo ad inserire una stringa con delle parentesi annidate ho dei problemi. Ad esempio la stringa:

"+5 (Valore 1 (prova(prova)) valore) -4 (Valore 2) +1 -7"

mi ritorna "error"

se usassi (.*?) invece di [^)]* mi restituisce:

Modificatori:
+5 (Valore 1 (prova(prova)
-4 (Valore 2)
+1
-7

Ignorando ciò che viene dopo la prima )
Però se uso (.*?) potrei scrivere "+5 (Valore 1)-4 (Valore 2)"
ed oltre a considerarmelo valido, mi considera solo il valore +5

Come faccio a far si che tutte le parentesi vengano prese in considerazione e che il controllo sulla correttezza della stringa funzioni ancora?