[PHP] berekening uitvoeren uit één inputveld

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Noot vooraf: De titel klinkt vaag en dat is ie ook :P

Goed.. heb dus het volgende:
Ik heb een inputveld, waar men een berekening in moet voeren. bijvoorbeeld: 1+2*3/6 dit gebeurt dus allemaal in in één input-veldje..

wat is nu de beste aanpak om dit te filteren, zodat ik de uitkomst (in bovenstaand geval 2) op het scherm kan laten zien van de ingevoerde formule?

ben al bezig geweest met reguliere expressies enzo en ben al wel zover dat ik de operanden en operatoeren gescheiden, maar kom er toch nog niet helemaal uit..

Iemand misschien tips over hoe je dit zou kunnen aan kan pakken?

Acties:
  • 0 Henk 'm!

  • koli-man
  • Registratie: Januari 2003
  • Laatst online: 12-09 14:21

koli-man

Bartender!!!!

ut kan met explode www.php.net/explode
Dan checken op de tekens + / * e.d en aan de hand van wat je overhoudt, moet je berekenen.
maar misschien dat je hier nog www.php.net/math nog wat betere voorbeeldjes vind.

[ Voor 74% gewijzigd door koli-man op 06-05-2004 16:04 ]

Hey Isaac...let's go shuffleboard on the Lido - deck...my site koli-man => MOEHA on X-Box laaaiiiff


Acties:
  • 0 Henk 'm!

Verwijderd

*inkoppertje*

wat heb je al? Wellicht dat je een stuk van de code kan posten waarin je de regexp gebruikt hebt.

Acties:
  • 0 Henk 'm!

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03 09:11
Je zou eval kunnen gebruiken, maar dan moet je wel eerst de input controleren.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goed.. hieronder staat de code die ik tot nu toe heb..

ik knip de string dus eerst in stukjes, waarna ik per character bekijk of het een operand of een operator is..

dat lukt dus wel.. maar het moeilijke is, is dat een '*' zwaarder weegt als een '+' en om dan maar niet te speken over eventuele haakjes..

dus wat tips zouden welkom zijn ;)


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
29
30
<?php
        $input = trim($_GET['waarde_1']);
        $input_arr = preg_split("//", $input);
        $overbodig = array_pop($input_arr);

        $operator = array( "+"=>1, "-"=>1, "*"=>2, "/"=>2, "("=>3, ")"=>3 );
        
        echo "<br>";
        
        while ( end($input_arr) != $input_arr[0] ) {
            if (preg_match("/[0-9]+|[+\-\/*]+/", end($input_arr)) ) {
                if (preg_match("/[0-9]+/", end($input_arr)) ) {
                    $temp_getal[] = array_pop($input_arr);
                }
                else {
                    $temp_operator[] = array_pop($input_arr);
                }
            }
            else {
                echo "<br>Dit is geen geldige invoer!";
                array_pop($input_arr);
            }
        }
        echo "<br><br><br>";
        echo "Getal: ";
        print_r($temp_getal);
        echo "<br>Operator: ";
        print_r($temp_operator);
        
?>

Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
Je wilt dus een expression parser maken. Dit is een vrij standaard probleem en er is veel over te vinden op internet.
Allereerst verdeel je de invoerstring in tokens. Een token is een getal (bijv '123') of een operator (bijv '+' of '(' ).

Je zit inderdaad met het probleem van de haakjes en met 'precedence' (oftewel meneer van dale wacht op antwoord) van je operatoren. Een manier om dit op te lossen is de formule eerst van infix naar post- of prefix om te zetten. Daarna is het uitrekenen simpel.

Je kan het ook direct uitrekenen, maar dan moet je iets meer je best doen.
De eval functie van php pakken is de makkelijkste weg, maar ook de gevaarlijkste omdat je de invoer dan goed moet controleren op code die er niet hoort.

[ Voor 5% gewijzigd door Sjaaky op 06-05-2004 16:36 ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

eval is redelijk veilig als je eerst alle letters uit de string verwijderd. Een functie kan niet met een cijfer beginnen of alleen cijfers bevatten, dus dan kan er niet zo heel veel meer fout gaan.

Dan kun je dus in principe alles gebruiken, zelfs haakjes om onderdelen van je som te groeperen.

Acties:
  • 0 Henk 'm!

  • Billie
  • Registratie: Januari 2003
  • Laatst online: 16-09 20:27
Op http://php.net/eval staat het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function matheval($equation){
       $equation = preg_replace("/[^0-9+\-.*\/()%]/","",$equation);
       $equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation);
       // you could use str_replace on this next line
       // if you really, really want to fine-tune this equation
       $equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation);
       if ( $equation == "" ) {
               $return = 0;
       } else {
               eval("\$return=" . $equation . ";");
       }
       return $return;
}


Lijkt mij dat ie alles doet wat jij wilt. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat script doet inderdaad alles wat ik wil, maar ik snap 2 regels niet en wel:
$equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation);
$equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation);
Wat betekenen die "*(1\$1.\$2)" en ".\$1" ?

Acties:
  • 0 Henk 'm!

Verwijderd

$equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation);

de $1 en $2 zijn backreferences. Deze variablen refereren naar de matches tussen ronde haken (eerste setje ronde haken is $1, 2e $2 enz)

[ Voor 37% gewijzigd door Verwijderd op 10-05-2004 20:34 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op 10 mei 2004 @ 11:48:
Dat script doet inderdaad alles wat ik wil, maar ik snap 2 regels niet en wel:

[...]


Wat betekenen die "*(1\$1.\$2)" en ".\$1" ?
drm in P&W FAQ - Regular expressions

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1