Hulp nodig bij reguliere expressie
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!!
Code (php)
1
2
3
4
5
6
7
8
9
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));
?>
$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; }
$uitkomst = een+(twee*2)+drie;if(vier > vijf) { $uitkomst+= vier; } else { $uitkomst+=vijf; }
Misschien dat dit de oplossing is:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sFormule = '[1] = [2] + [3]';
$sFormule = preg_replace('/\[\d+\]/', array(10,20,30), $sFormule);
echo $sFormule;
?>
$sFormule = '[1] = [2] + [3]';
$sFormule = preg_replace('/\[\d+\]/', array(10,20,30), $sFormule);
echo $sFormule;
?>
Gewijzigd op 01/01/1970 01:00:00 door Ruud Heines
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
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
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;
?>
$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;
?>