Klammern lösen mit Regulären Ausdrücken

camelmed

Grünschnabel
Hello allerseits,

bin ich noch Anfänger was RegEx angeht.
So einfachere Sachen wie Datum oder e-mail prüfen geht schon,
aber ich versuche gerade klammern zu lösen und da stehe ich nun an.
Mal als Beispiel:

( (2-4) * 4 ) * (5+7)

Habs mal so versucht aber da kommt nichts gescheites dabei raus:

Code:
$str = '((2-4)*4)*(5+7)';
$muster = '(\([0-9|\+|\-|\*|\/]*\))';
preg_match_all("/$muster/",$str,$arr);
das bringt nur:
Code:
 array(2) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "(2-4)"
    [1]=>
    string(5) "(5+7)"
  }
  [1]=>
  array(2) {
    [0]=>
    string(5) "(2-4)"
    [1]=>
    string(5) "(5+7)"
  }
}

Wie kann ich die Klammern in den Klammern berücksichtigen?
bzw. ist es möglich das in so (o.ä.) ein Array aufzulösen?

[0][0] => '2-4'
[0][1] => '*4'
[1] => '5+7'

ciao
Toni
 
habs nun anders gelöst:

Code:
$str = trim_code($str);
for($i=0;$i<strlen($str);$i++)
        {
            $c=substr($str,$i,1);
            $c_a .= $c;

            // BEI SCHLIESSENDER KLAMMER REAGIEREN
            if($c == ')')
            {
                // ERSTE ÖFFNENDE KLAMMER DAVOR FINDEN
                $pos=strrpos($c_a, '(');
                // LÄNGE DES STRINGS IN DER KLAMMER
                $len=strlen($c_a)-$pos;
                // STRING IN DER KLAMMER (ohne Klammern)
                $res = substr($str,$pos+1,$len-2);
                // LETZTEN STRING VOR DER KLAMMER EXTRAHIEREN
                $tmp = substr($str,0,$pos);
                $tmp2 = explode(' ' , $tmp);
                $cnt=count($tmp2)-2;
                $tmp3 = trim($tmp2[$cnt]);
                $res=str_replace(' ','', $res);
                // PRÜFEN OB DIES EINE RECHENFUNKTION IST
                if(in_array($tmp3, $calc_arr))
                {
                    //STRING AUSLÖSEN
                    @eval("\$ret = $tmp3($res);");
                    // KLAMMER lösen
                    $str=substr_replace($str,$ret,($pos-strlen($tmp3)-1),($i-$pos+strlen($tmp3)+2));
                    // NÄCHSTE EBENE
                    $str = loskla($str);
                }
                else
                {
                    //STRING AUSLÖSEN
                    @eval("\$ret = $res;");
                    // KLAMMER lösen
                    $str=substr_replace($str,$ret,$pos,($i-$pos+1));
                    // NÄCHSTE EBENE
                    $str = loskla($str);
                }
            }

Das ganze wird eine Art "Taschenrechner" funktioniert auch schon halbwegs nur mit Variablen kann man noch nicht rechnen aber das werd ich auch noch lösen :)

Wers in aktion sehen will findets unter calculator

ciao Ante
 
Zurück