[php]Excel formule string doorrekenen met php

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Vooralsnog werkt het aardig alleen zit ik met een klein probleempje
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?
function calculate_formula_string($string)
{
    //MENEER VAN DALEN WACHT OP ANTWOORDT
    //MACHTSVERHEFFEN VERMENIVULDIGEN DELEN WORTELTREKKEN OPTELLEN AFTREKKEN

    $i = 0;
    $number[$i] = "3*4.5/4*(56-4)"; 
    $number[$i] = str_replace ("(", "", $number[$i]);
    $number[$i] = str_replace (")", "", $number[$i]);

    $divide_params = preg_split('/\^|\*|\/|\+|\-/', $number[$i], -1, PREG_SPLIT_OFFSET_CAPTURE);
    //$divide_params = preg_match('/(\()(.*)(\))/', $number[$i]);

    $number[$i] = $divide_params[0][0];
    foreach($divide_params[$i] as $key => $value)
    {
        if(isset($divide_params[$key]) && $key > 0)
        {
            $number[$i] = $number[$i] . $number[$i]{$divide_params[$key][1]} . $divide_params[$key];
        }
    }

    print "<pre>";
    print_r($divide_params);
    print "</pre>";
}
?>

Bovenstaand wil ik de variabele $number[$i]{$divide_params[$key][1]} gebruiken als (* of / of ^).
Die waarde haal ik uit de string die de gebruiker invoert. Hoe krijg ik het voorelkaar dat dit stukje string ook gezien wordt als 'breuk, etc' (zie regel 20).

(p.s. ik heb niet getest of ^ sowieso al werkt, misschien is hier een functie voor ofzo).

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

Verwijderd

Je zou eens moeten kijken naar het parsen tot een boom-structuur, waar in de "root" van twee bladeren de wiskundige opdracht staat. Deze kun je daarna weer "in elkaar" schuiven en uitrekenen.

Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

als de operators in je string alleen +, -, *, / en ^ zijn lijkt het me net zo gemakkelijk om eval te gebruiken. Als je het, om wat voor reden dan ook, toch zelf wilt doen lijken regular expressions niet 'the way to go'
Evt. zoektermen: parsing, rpn (reverse polish notation), finit state machine

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
ja naar eval heb ik ook al gekeken, en ik gebruik idd alleen die operators die jij opsomt (/ * ^ + en -)
dat probleem met het afvangen van een string "*" naar een operator kan iig met eval

[ Voor 30% gewijzigd door wboard op 23-01-2006 22:52 ]

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Dan is het toch simpel:
PHP:
1
2
3
4
function calculate_formula_string($string)
{
    return eval("return " . $string . ";" );
}

Dit zou volgens mij moeten werken (als ik de docs goed lees).

Je moet dan uiteraard eerst de input valideren, dat kan dan weer prima met regexes.

[ Voor 23% gewijzigd door NetForce1 op 23-01-2006 23:02 ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
damn.. inderdaad
wat kan het leven toch soms simpel zijn (8>
merci!

A smooth sea never made a skilled sailor


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Het lijkt me niet de meest veilige code. Wat nu als ik als expressie "show_source("db_connect.php");" opgeef?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Janoz schreef op dinsdag 24 januari 2006 @ 09:21:
Het lijkt me niet de meest veilige code. Wat nu als ik als expressie "show_source("db_connect.php");" opgeef?
Daarom zeg ik ook dat de string eerst gevalideerd moet worden he. Als je een regex maakt die alleen numerieke waarden en de genoemde operators accepteerd lijkt me dat jouw expressie daar niet doorheen moet komen.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • wboard
  • Registratie: Juli 2002
  • Laatst online: 04-04-2022

wboard

-=<wboard>=-

Topicstarter
Inderdaad, eerst valideren. Maar het is toch een applicatie die intern bij bedrijven gaat draaien,
dus kwaadwillende zullen er niet bijkomen

A smooth sea never made a skilled sailor

Pagina: 1