Kleine Frage vorweg:
Was ist, wenn gar keine Klammern im Term stehen? Ich denke da an
Es gibt in PHP meines Wissens nach den Modifier
/g in PHP nicht, so dass die Sache mit RegExen komplizierter wird. Aber warum zerhackst Du Deinen String nicht an "^" und arbeitest ihn dann von rechts nach links ab... nee, blöde Idee, weil Du so die zusammengehörigen Tokens nicht genau rauskriegst.
Vielleicht so:
Code:
<?php
function masquerade ($s) {
$patterns = array (
'/\(/', '/\)/', '/\+/', '/\*/', '/\^/',
);
$replaces = array (
'\\(', '\\)', '\\+', '\\*', '\\^',
);
return (preg_replace ($patterns, $replaces, $s));
}
$term = '(9-x+(5*x)^5)^(x-5*(4-7)+2)';
while (preg_match ('/((?:[0-9A-Za-z]+|\(.+\))\s*)\^(\s*(?:[0-9A-Za-z]+|\(.+\)))/', $term, $match)) {
$pattern = sprintf ('#%s\^%s#', masquerade ($match[1]), masquerade ($match[2]));
$replace = sprintf (' pow (%s, %s) ', $match[1], $match[2]);
print (sprintf ("Ersetze <%s> durch <%s>...\n", $pattern, $replace));
$term = preg_replace ($pattern, $replace, $term);
print (sprintf ("Vorläufig: %s\n", $term));
}
print (sprintf ("%s\n", $term));
?>
Ist noch nicht so elegant, aber vielleicht ein Ansatz. Vielleicht solltest Du aber wirklich einen Ansatz über einen Tokenizer wählen, der Dir diese Arbeit abnimmt...
--
Denke bitte auch an Vereinfachungen: Satz: Potenzen werden potenziert, indem man die Exponenten multipliziert.
--
Verdammtes php-Tag, warum tut das nicht???