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?