Reguläre Ausdrücke in zusammenhang mit Mathe

Binio

Erfahrenes Mitglied
Ich möchte einen Klasse schreiben die mir Aufgaben ausrechnet oder/und auflöst. Ich stehe mit der Programmierung ganz am Anfang. Daher bin ich für jeden Tipp was eine Lösung angeht sehr dankbar. Wenn es sowas schon gibt bitte ich um ein LINK :).

Also mein Aktuelles Problem ist das ich erstmal jede eingegebene Formel/Aufgabe in einen mir logische Form bringe um damit später weiterzurechnen. Wenn ich da ein denkfehler habe bitte ich auch um korrektur.
Also ich möchte

Code:
4+8*67
in

Code:
(+4)+(+8)*(+67)
bringen. Das gelingt mir zur Zeit auch sehr gut mit

PHP:
<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
       "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head>
<meta name="description" content="Mathe Lernen">
<meta name="author" content="Robert Slowikowski">
<meta name="keywords" content="Mathe,Addition,Subtraktion">
<meta name="date" content="2007-05-13T14:41:35+0200">
<!-- ... andere Angaben im Dateikopf ... -->
<title>Thermumformung</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head> 
<body>

    <?php
        include_once("class/term.php");
    ?>
    <table border='0'>
    <form action='' method='post'>
        <tr>
            <td>
                Eingabe:<input type='text' name='eingabe' id='eingabe' value='<?php echo $_POST['eingabe'] ?>' size='150' /><br />
            </td>
        </tr>
        <?php

            $my2 = preg_replace("!([\d]+)(\+|-|\*|\/)?!","(+$1)$2",$_POST['eingabe']);

        ?>
        <tr>
            <td>
                Ausgabe:<input type='text' name='ausgabe' id='ausgabe' value='<?php echo $my2 ?>' size='200' /><br />
            </td>
            <td>
                <?php echo strlen($_POST['eingabe']) ?>
            </td>
        </tr>
        <tr>
            <td>
                <input type='submit' value='Senden' />
            </td>
        </tr>
    </form>
    </table>

</body> 
</html>
Alles wird super umgewandelt.
Doch wenn mal jemand (+4)+6 eingibt(<- was nicht falsch ist)
gibt es ein kleines ungeschick :mad:

Bsp:
Code:
43+35-8*545/-5467(eingabe)
wird zu
Code:
(+43)+(+35)-(+8)*(+545)/-(+5467)(ausgabe)
aber
Code:
(+43)+35-8*545/-5467(eingabe)
soll nicht zu
Code:
(+(+43))+(+35)-(+8)*(+545)/-(+5467)(ausgabe)
sondern zu
Code:
(+43)+(+35)-(+8)*(+545)/-(+5467)(asugabe)
werden

Hoffe es kann mir einer Helfen.
Hab mir das http://www.devmag.net/webprog/regulaere_ausdruecke.htm
tutorial durchgelesen aber ich muss sagen Reguläre Ausdrücke sind crasy und mighty
 
Probier mal, die Klammer einfach mit zu ersetzen:

PHP:
$my2 = preg_replace("![\([\+|\-|\*|\/]+]?([\+|\-|\*|\/])?(\d+)[\)]?!","(+$2)",$_POST['eingabe']);

EDIT: Vor dem Minus musste auch noch ein Slash damit es klappt ;)
 
Zuletzt bearbeitet:
Hallo,

mit regulären Ausdrücken (alleine) wirst du hier leider nicht weit kommen, da die arithmetischen Ausdrücke keine reguläre Sprache bilden. Ich verstehe auch nicht ganz, was du mit dieser Vorverarbeitung (Hinzufügen von Klammern) erreichen willst. Inwiefern erleichtert das die Weiterverarbeitung? Ich würde hier mit der Konstruktion eines geeigneten Kellerautormaten an das Problem herangehen.

Grüße,
Matthias
 
Leider klappt das auch nicht so :mad:
Aus
Code:
43+35-(+8)*545/-5467
wird
Code:
43(+35)(+8)(+545)(+5467)

Es fehlen alle Operatoren + - * / und die erste Zahl ist leider ohne Klammerung.

Das ich mit den regulären ausdrücken nicht weit komme weiss ich auch. Sie diennen mir nur als Vorbereitung bis ich den Ausdruck in meine Klasse schicke. Wie gesagt soll meine Klasse +4*4 verstehen und (+4)*4. Daher stelle ich sofort alles in dieser Schreibweis dar und übergebe es erst dann. Die Auswertung passiert dann mit ein selbst geschriebenen Parser :)
 
Ok. Da du ja schon eine passende Funktion hast wenn der String klammerlos ist entferne wie Klammern vorher:
PHP:
$s = preg_replace("![\(][\+\-\*\/]([\d]+)\)!", "$1", $target);

Und danach deine andere Variante für normale Ausdrücke.
Man kriegt bestimmt alles in einen aber so weit reicht mein Kopp im Moment nich.

EDIT: Hier noch einer der eventuell alles auf einmal macht:
PHP:
$s = preg_replace("!\([\+\-\*\/]([\d]+)\)|([\+\-\*\/])(\d+)!", "$2(+$1$3)", $target);
 
Zuletzt bearbeitet:
Zurück