LML пишет:Встречал я подобные способы реализации. Но везде пишут - использовать только в обучающих программах! eval(), штука жутко нехорошая... А у меня кто угодно боту написать может.
с eval или без него необходимо убирать мусор из строки и оставлять только числа и знаки
Спойлер (Отобразить)Цитата:<?
echo "c eval:<br>";
$str = 'fdhdhf222Смешно-95+прибавить десять10-11зачем то минус-16+20*5+7/2 =ппрлплрд';
echo "оригинал:<br>$str<br>";
$str = preg_replace("/[^\d+\+\-\*\/]/","",$str);
echo "убрали мусор:<br>$str<br>";
preg_match_all("/(\d+|(\+|\-|\*|\/)\d+)/",$str,$match);
$outstr="";
foreach ($match[0] as $v) $outstr .= $v;
eval("\$outNumber=".$outstr.";");
echo $outstr."=".$outNumber;
echo "<hr>Без eval:<br>";
$str = 'fdhdhf222-95+10-11-16+20+7 =ппрлплрд';
echo "оригинал:<br>$str<br>";
$str = preg_replace("/[^\d+\+\-\*\/]/","",$str);
echo "убрали мусор:<br>$str<br>";
preg_match_all("/(\d+|(\+|\-)\d+)/",$str,$match);
$outstr="";
$outNumber=0;
foreach ($match[0] as $v)
{
$outstr .= $v;
$outNumber+= $v;
}
$outstr .= $v;
echo $outstr."=".$outNumber;
/*
c eval:
оригинал:
fdhdhf222Смешно-95+прибавить десять10-11зачем то минус-16+20*5+7/2 =ппрлплрд
убрали мусор:
222-95+10-11-16+20*5+7/2
222-95+10-11-16+20*5+7/2=213.5
Без eval:
оригинал:
fdhdhf222-95+10-11-16+20+7 =ппрлплрд
убрали мусор:
222-95+10-11-16+20+7
222-95+10-11-16+20+7+7=137
*/
?>
(дополнение)
LML пишет: eval(), штука жутко нехорошая...
Как Вы думаете, почему эта "жутко нехорошая штука" не исключена из PHP и из JS?
Просто нужно не допускать, чтобы туда подал вредоностный код и за тем, что бы там было
действительно арифметическое выражение, т.е. строка кода, которая не выдаст фотальную ошибку.
Для этого нужно ставить обработчик ошибок и определиться, как на них реагировать.
В Вашем случае, можно реализовать польскую запись самостоятельно или
использовать eval и PHP интерпетатор сделает это лучше и быстрее чем Вы.