Hulp nodig bij reguliere expressie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ruud Heines

Ruud Heines

20/03/2007 09:27:00
Quote Anchor link
Hoi,

ik zit met het volgende probleem. Voor een vragenlijsten module moet aan de hand van een formule de score worden berekend. In die formule wil ik de vragen aanduiden door het volgnummer van de vraag tussen [] te plaatsen. Deze wil ik dan dmv reguliere expressies te vervangen door de ingevulde waardes.

voorbeeld van een formule:

$uitkomst = [1]+([2]*2)+[3];
if([4] > [5]) { $uitkomst+= [4]; } else { $uitkomst+=[5]; }

deze formule wordt in de database opgeslagen en dmv van de functie eval() uitgevoerd (dit heeft als voordeel dat ik bij de formule gebruik kan maken van if statements etc). Maar zoals gezegd moet dus eerste alle [nr] vervangen worden door de waarde die de gebruiker heeft ingevuld (het antwoord gegeven op de vraag)

mijn vraag is dus: kan iemand me helpen met een reguliere expressie die er dan ongeveer zo uit ziet: ereg_replace(expressie,getWaardeById(\\1),formule). De expressie moet dus zoeken naar alle getallen die tussen [] staan en deze vervangen door waardes, bijv.

$uitkomst = 2+(1*2)+2;
if(2 > 1) { $uitkomst+= 2; } else { $uitkomst+=1; }

wat betreft dat getWaardeById(). aan de hand van het getal tussen de [] moet in de database een waarde worden gezocht. Ik weet dat dmv \\getal je een substring kunt gebruiken uit de expressie. lukt me alleen niet om mee te geven aan een functie.

Hoop dat het een beetje duidelijk is en als iemand me hierbij kan helpen, dan zou dat geweldig zijn!!
 
PHP hulp

PHP hulp

22/11/2024 08:34:36
 
Jan Koehoorn

Jan Koehoorn

20/03/2007 09:38:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
    $formule
= '$uitkomst = [1]+([2]*2)+[3];';
    $formule .= 'if([4] > [5]) { $uitkomst+= [4]; } else { $uitkomst+=[5]; }';
    $vragen = array ('/\[1\]/', '/\[2\]/', '/\[3\]/', '/\[4\]/', '/\[5\]/');
    $antwoorden = array ('een', 'twee', 'drie', 'vier', 'vijf');
    echo htmlentities ($formule);
    echo '<hr>';
    echo htmlentities (preg_replace ($vragen, $antwoorden, $formule));
?>

output:
Quote:
$uitkomst = [1]+([2]*2)+[3];if([4] > [5]) { $uitkomst+= [4]; } else { $uitkomst+=[5]; }
$uitkomst = een+(twee*2)+drie;if(vier > vijf) { $uitkomst+= vier; } else { $uitkomst+=vijf; }
 
Martijn B

Martijn B

20/03/2007 09:41:00
Quote Anchor link
Ik heb je vraag niet goed doorgelezen.
Misschien dat dit de oplossing is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$sFormule
= '[1] = [2] + [3]';

$sFormule = preg_replace('/\[\d+\]/', array(10,20,30), $sFormule);

echo $sFormule;
?>
 
Ruud Heines

Ruud Heines

20/03/2007 09:54:00
Quote Anchor link
Jan bedankt voor de snelle reactie. het is alleen niet helemaal wat ik zoek. bij jouw voorbeeld zijn namelijk de vraagnummers en de waardes al voorgedefinieerd en bij wat ik nodig heb moet dat variabel zijn. Ik weet van tevoren niet welke vraagnummers in de formule zitten en de waardes moeten aan de hand van het vraagnummer worden opgezocht.
Gewijzigd op 01/01/1970 01:00:00 door Ruud Heines
 
Ruud Heines

Ruud Heines

20/03/2007 10:02:00
Quote Anchor link
Martijn! jouw oplossing helpt al een stuk op weg. heb nu dit (want die array werkte niet en is ook niet goed aangezien het dan weer voorgedefinieerd moet zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sFormule
= preg_replace('/\[(\d+)\]/', "\\1", $sFormule);
?>


nu alleen nog zo dat \\1 mee wordt gegeven aan een functie die de bijbehorende waarde kan ophalen. dus zoiets als getWaardeById(\\1). Ik weet niet zeker of het uberhaupt mogelijk is.
Gewijzigd op 01/01/1970 01:00:00 door Ruud Heines
 
Jan Koehoorn

Jan Koehoorn

20/03/2007 10:07:00
Quote Anchor link
Ruud Heines schreef op 20.03.2007 09:54:
Jan bedankt voor de snelle reactie. het is alleen niet helemaal wat ik zoek. bij jouw voorbeeld zijn namelijk de vraagnummers en de waardes al voorgedefinieerd en bij wat ik nodig heb moet dat variabel zijn. Ik weet van tevoren niet welke vraagnummers in de formule zitten en de waardes moeten aan de hand van het vraagnummer worden opgezocht.

In mijn voorbeeld zijn ze inderdaad voorgedefiniëerd als array. Maar die kun je toch variabel maken door ze uit een formulier te laten komen? De lengte van de arrays doet er niet toe voor preg_replace. Als de arrays $vragen en $antwoorden maar even lang zijn.
 
Ruud Heines

Ruud Heines

20/03/2007 10:13:00
Quote Anchor link
heb de oplossing gevonden. Er bestaat ook de functie preg_replace_callback(). hierin kun je een functie definieren:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$sFormule
= '$uitkomst = [1]+([2]*2)+[3];
if([4] > [5]) { $uitkomst+= [4]; } else { $uitkomst+=[5]; }'
;

$sFormule = preg_replace_callback('/\[(\d+)\]/', create_function(
                      '$matches',
           'return getWaardeById($matches[1]);')
,
$sFormule);
echo $sFormule;
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.