Non è con un'espressione regolare, ma questo funziona:
Codice PHP:
function parse_fraction ($fraction) {
list($n, $d) = explode("/", $fraction);
$n = strrev($n);
foreach (array("n", "d") as $var) {
$brackets = 0;
$parsed = "";
foreach (str_split($$var) as $token) {
if ($token == "(") {
if ($brackets != 0 && $brackets != -1) {
$parsed .= "(";
}
$brackets++;
} else if ($token == ")") {
if ($brackets != 0 && $brackets != 1) {
$parsed .= ")";
}
$brackets--;
} else if (in_array($token, array("+", "*", "-")) && $brackets == 0) {
break;
} else {
$parsed .= $token;
} }
$$var = $parsed;
}
return array(strrev($n), $d);}
Codice PHP:
print_r(parse_fraction("(5+2)/((3^4)+3)-5")); // stampa Array ( [0] => 5+2 [1] => (3^4)+3 )