Funktionen umwandeln

rambo

Mitglied
Hi,

ich habe mir ein Kleines Script gebastelt, das mit mithilfe einer Wertetabelle Hyperbeln und Parabeln zeichnen kann. Jetzt muss man aber dann, da die Funktion über eval ausgerechnet wird, es so angeben:
Code:
2 * pow((x - 1), 3) + 2

Das wäre dann
Code:
2(x - 1)^3 + 2

Aber wie kann ich das denn jetzt umwandeln? Ich habe es mit preg_replace() versucht:

PHP:
$f = "2 * (x - 1)^3 + 2";

$f = preg_replace("/(.*)\^(.*)/siU", "pow(\\1, \\2", $f);

Aber da kommt natürlich dann
Code:
pow(2 * (x - 1), 3 + 2)
bei raus...

Hat jemand einen Tipp, wie ich das vernünfitg "umwandeln" kann?

Danke im Voraus...
 
Zuletzt bearbeitet:
Hallo,

am besten wäre es, wenn du mit einem Parser zunächst einen Syntaxbaum zum Ausdruck ermittelst, z.B. über rekursiven Abstieg. Zur Auswertung des Ausdrucks traversierst du dann den Syntaxbaum. Ganz nebenbei sortierst du so auch noch gefährliche und/oder unsinnige Ausdrücke aus.

Grüße,
Matthias
 
Vielen Dank für die Antwort, Matthias!

Ich verstehe zwar herzlich wenig von dem, was Du gepostet hast, ich habe es aber noch nicht aufgegeben.

Ich habe mich aber damit nochmal auseinandergesetzt:
PHP:
$func = str_replace("²", "^2", $func);
$func = str_replace("³", "^3", $func);
$func = preg_replace("/(\b|\s)(-*?[0-9]*?.*?[0-9]*?x*?)\^(-*?[0-9]*?.*?[0-9]*?x*?)(\b|\s)/siU", "\\1pow(\\2, \\3)\\4", $func);

Bis jetzt kann es mir problemlos x^-0.5 o.ä. konvertieren, mehr aber auch nicht...
 
Also, ich habe eine Rekursiv-Funktion bei de.php.net gefunden und habe versucht sie abzuändern:

PHP:
$input = "test (123(sdf)123(s))44";

function parseTagsRecursive($input)
{

  $regex = '#\(((?:[^[]|(\(|\))|(?R))+)\)#';


    if (is_array($input)) {
        $input = '<div style="margin-left: 10px">'.$input[1].'</div>';
    }

    return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}

$output = parseTagsRecursive($input);

Hmm, funktioniert leider mit Klammern (bei mir) nicht...
 
Zurück