Hi,
nachdem Frank hier schon Code gepostet hat und Toben damit vermutlich schon freudestrahlend zu seinem Chef gerannt ist, hier mein Versuch:
Das Beispiel zeigt, daß mit regulären Ausdrücken einiges zu machen ist, etwas Erfahrung ist jedoch notwendig. Der Code ist noch recht kurz, aber auch dem geschuldet, daß gegen den allgemeinen Coding-Standard verstoßen wird. Ich kann mich einfach nicht daran gewöhnen, daß ich dies
so schreiben soll
und Würmer wie
formal in Ordnung gehen. Aber dies nur nebenbei.
Die obige Funktion wurde kurz getestet, schafft auch Klippen wie '-3*-5'.
Aber keine Rede von Totgetestet.
Edit: Was spricht gegen eval, wenn ich den String entsprechend validiere?
LG jspit
nachdem Frank hier schon Code gepostet hat und Toben damit vermutlich schon freudestrahlend zu seinem Chef gerannt ist, hier mein Versuch:
PHP-Code:
/*
* math_parse berechnet mathematische Ausdrücke ohne die Nutzung von eval
* operatoren: + - * / ^ ( )
* funktionen: sqrt, sin, cos
*/
function math_parse($strMath)
{
$fktlist = array('sqrt','sin','cos');
$bparse = function($math) {
$ops = array('^','/','*','+','-');
foreach($ops as $op) {
$regEx = '~(^\-\d+\.?\d*|\d+\.?\d*)'.preg_quote($op).'([\-+]?\d+\.?\d*)~';
while(preg_match($regEx,$math,$match)) {
list($all,$v1,$v2) = $match;
if($op == '^') $r = pow($v1,$v2);
if($op == '/') $r = $v1/$v2;
if($op == '*') $r = $v1*$v2;
if($op == '-') $r = $v1-$v2;
if($op == '+') $r = $v1+$v2;
$math = str_replace(
array($all, '+-','-+','--','++'),
array( (string)$r ,'-','-','+','+'),
$math
);
}
}
return is_numeric($math) ? (float)$math : false;
};
$strMath = str_replace(
array(' ',','),
array('','.'),
$strMath
);
$regEx = '~('.implode('|',$fktlist).')?\(([^()]+)\)~';
while( preg_match($regEx,$strMath,$match)) {
$expr = $bparse($match[2]);
if($match[1] !== '') $expr = $match[1]($expr);
$strMath = str_replace($match[0],$expr,$strMath);
debug::write($match);
}
return $bparse($strMath) ;
}
PHP-Code:
if($op == '/') $r = $v1/$v2;
PHP-Code:
if($op == '/') {
$r = $v1/$v2;
}
PHP-Code:
while(preg_match('~(^\-\d+\.?\d*|\d+\.?\d*)'.preg_quote($op).'([\-+]?\d+\.?\d*)~',$math,$match)) {
Die obige Funktion wurde kurz getestet, schafft auch Klippen wie '-3*-5'.
Aber keine Rede von Totgetestet.
Edit: Was spricht gegen eval, wenn ich den String entsprechend validiere?
LG jspit
Kommentar