<?php
# php >5.5 preg_replace ??????????? /e ??????????
# ?????? ?????? ??? ?????? ?????? ? php 7 ??? ?? ????????
# H::bc('(1+2)-1'); H::bc('($1+$2)-$3','1','2','1') ?????? ???????????, ?????? ???????? ? ??????? ????? ???????.
# ????? ?????? ? ??????? ? ?????? ?? ??? ??? ???? ??? ?? ?????????
return function () {
$argv = func_get_args();
$string = str_replace(' ', '', "({$argv[0]})");
$operations = array();
if (strpos($string, '^') !== false) $operations[] = '\^';
if (strpbrk($string, '*/%') !== false) $operations[] = '[\*\/\%]';
if (strpbrk($string, '+-') !== false) $operations[] = '[\+\-]';
if (strpbrk($string, '<>!=') !== false) $operations[] = '<|>|=|<=|==|>=|!=|<>';
//$string = preg_replace('/\$([0-9\.]+)/e', '$argv[$1]', $string);
$string = preg_replace_callback('/\$([0-9\.]+)/', function($m) use($argv){
return $argv[$m[1]];
},$string);
while (preg_match('/\(([^\)\(]*)\)/', $string, $match)) {
// print_r($match);
foreach ($operations as $operation) {
if (preg_match("/([+-]{0,1}[0-9\.]+)($operation)([+-]{0,1}[0-9\.]+)/", $match[1], $m)) {
switch($m[2]) {
case '+': $result = bcadd($m[1], $m[3]); break;
case '-': $result = bcsub($m[1], $m[3]); break;
case '*': $result = bcmul($m[1], $m[3]); break;
case '/': $result = bcdiv($m[1], $m[3]); break;
case '%': $result = bcmod($m[1], $m[3]); break;
case '^': $result = bcpow($m[1], $m[3]); break;
case '==':
case '=': $result = bccomp($m[1], $m[3]) == 0; break;
case '>': $result = bccomp($m[1], $m[3]) == 1; break;
case '<': $result = bccomp($m[1], $m[3]) ==-1; break;
case '>=': $result = bccomp($m[1], $m[3]) >= 0; break;
case '<=': $result = bccomp($m[1], $m[3]) <= 0; break;
case '<>':
case '!=': $result = bccomp($m[1], $m[3]) != 0; break;
}
$match[1] = str_replace($m[0], $result, $match[1]);
}
}
$string = str_replace($match[0], $match[1], $string);
}
return $string;
};?>
|