时间:2021-07-01 10:21:17 帮助过:38人阅读
例如:(21*12-23-(21+14-(21-31/3+(14-21*12-14))+54)-21)+21*25-22*26
然后解析的结果就是:-169.33。
现将代码贴出,如果有不妥的地方还请各位程序员朋友们指出。
if(isset($_GET['sizhi'])){ $sizhi=$_GET['sizhi']; if(!checkSizhi($sizhi)){ echo('算式不合法,检查括号是否配对'); }else{ $sizhi=priority($sizhi); echo(calculate($sizhi)); } } //检查算式是否合法 function checkSizhi($sizhi){ $Amatch=array(); $pattern='/((\d|!)\()|([-\+\*\/]\))|[^-\+\*\/!\d\(\)]/'; if(preg_match($pattern,$sizhi,$Amatch)>0){ echo('不合法的元素:'); print_r($Amatch); return false; }else{ $kuohao=0; for($i=0,$k=strlen($sizhi);$i<$k;$i++){ if($sizhi[$i]=="("){ $kuohao++; } if($sizhi[$i]==")"){ $kuohao--; if($kuohao<0)return false; } } if($kuohao!=0)return false; return true; } } //获得优先权 处理括号内的内容 function priority($sizhi,$start=0){ for($i=$start;$i结果为:+5 -3 *8 /5 $par='/[-\+\/\*]-?(\d\.?)+/'; preg_match_all($par, $sizhi, $array); return sum($array[0]); } //计算只含加减乘除的算式 function sum($ziArry){ for($i=0;$i0){ echo("阶乘阶段出问题,请改算式"); exit(); }else{ //替换所有阶乘的部分 $sizhi=preg_replace_callback($par,function($siz){ return calculateFactorial($siz[0]); } , $sizhi); } //交换符号与数字并计算 return change($sizhi); } //计算阶乘 function calculateFactorial($sizhi){ for ($i=0; $i 结果为:例如 +5-3*8/5 提取
以上就介绍了算式的解析算法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。