Re: чтение RSS + другие скрипты
Добавлено: Пт июн 15, 2018 10:46 am
всё равно не хочет озвучивать (
Обсуждение проекта
https://mjdm.ru/forum/
я думаю не имеет значения длинна фразы, просто в ходе ошибка
Код: Выделить всё
//$matches[2]='30% от 1500';
global $sum;
//калькулятор
function PERC($a,$b){
global $sum;
$sum=($a * $b)/100;
}
function INCR($a,$b){
global $sum;
$sum=($a * $b);
}
function DECR($a,$b){
global $sum;
$sum=($a / $b);
}
function MINUS($a,$b){
global $sum;
$sum=($a - $b);
}
function PLUS($a,$b){
global $sum;
$sum=($a + $b);
}
//если все пришло в одну строку то разбиваем ее на массив
//eсли несколько аргументов то смотрим все и создаем из них массив
if(empty($matches[2])){
$dig=preg_replace('/(\d+)/', '${1} ',$matches[2]);
$mas[]=preg_split( '/(\-|\+|\*|\/|\%)/', $dig);
$op=preg_replace('/x/','*',$matches[2]);
$op=preg_replace('/(\d+|\+|\-|\%|\*|\/)/', '${1} ',$op);
$mas[]=preg_split( '/(\d+| )/', $op );
}else{
foreach($matches as $ar) {
$ar=preg_replace('/[a-я]/isu','',$ar);
$ar=preg_replace('/x/','*',$ar);
$ar=preg_replace('/(\d+|\+|\-|\%|\*|\/)/','${1} ',$ar);
$ar=split(' ',$ar);
$mas[]=$ar;
}
}
//обрабатываем массив чисел и символов и создаем из них два массива: первый с числами второй с символами
foreach($mas as $or){
foreach ($or as $sym){
$sym=preg_replace('/ /','',$sym);
if (strlen($sym) !="0" ){
if (is_numeric($sym)){
$digit[]=$sym;
}else{
$oper[]=$sym;
}
}
}
}
if(in_array('%',$oper)){
if(array_search('%',$oper) == '0'){
$a=$digit[0];
$b=$digit[1];
PERC($a,$b);
$s="$a% от $b ";
}else {
$a=$digit[0];
$b=$digit[1];
PERC($a,$b);
$digit[1]=$sum;
$s="$b%";
}
}
if(in_array('*',$oper)){
$a=$digit[0];
$b=$digit[1];
INCR($a,$b);
$s="$a умножить на $b";
}
if(in_array('/',$oper)){
$a=$digit[0];
$b=$digit[1];
DECR($a,$b);
$s="$a разделить на $b";
}
if(in_array('+',$oper)){
$a=$digit[0];
$b=$digit[1];
PLUS($a,$b);
$s="$a плюс $b";
}
if(in_array('-',$oper)){
$a=$digit[0];
$b=$digit[1];
MINUS($a,$b);
$s="$a минус $b";
}
if ($sum){
sayReply("$s будет: $sum",10);
}else{
sayReply("Я не понимаю $matches[2]",10);
}
При помощи eval всё-таки гораздо короче реализуетсяSas писал(а): ↑Вс июн 17, 2018 11:19 pmЗапилил простой калькулятор. может использоваться как голосом так и через телегу/терминал
Писать можно как 2+2 так и 2 + 2 и хоть 2 +2.
Умеет считать 2 + 2 и проценты
например: 30% от 1000, или 1000 - 30%.
чтоб говорила голосом измените 10 в sayReply на свое значение
сам код.Код: Выделить всё
//$matches[2]='30% от 1500'; global $sum; //калькулятор function PERC($a,$b){ global $sum; $sum=($a * $b)/100; } function INCR($a,$b){ global $sum; $sum=($a * $b); } function DECR($a,$b){ global $sum; $sum=($a / $b); } function MINUS($a,$b){ global $sum; $sum=($a - $b); } function PLUS($a,$b){ global $sum; $sum=($a + $b); } //если все пришло в одну строку то разбиваем ее на массив //eсли несколько аргументов то смотрим все и создаем из них массив if(empty($matches[2])){ $dig=preg_replace('/(\d+)/', '${1} ',$matches[2]); $mas[]=preg_split( '/(\-|\+|\*|\/|\%)/', $dig); $op=preg_replace('/x/','*',$matches[2]); $op=preg_replace('/(\d+|\+|\-|\%|\*|\/)/', '${1} ',$op); $mas[]=preg_split( '/(\d+| )/', $op ); }else{ foreach($matches as $ar) { $ar=preg_replace('/[a-я]/isu','',$ar); $ar=preg_replace('/x/','*',$ar); $ar=preg_replace('/(\d+|\+|\-|\%|\*|\/)/','${1} ',$ar); $ar=split(' ',$ar); $mas[]=$ar; } } //обрабатываем массив чисел и символов и создаем из них два массива: первый с числами второй с символами foreach($mas as $or){ foreach ($or as $sym){ $sym=preg_replace('/ /','',$sym); if (strlen($sym) !="0" ){ if (is_numeric($sym)){ $digit[]=$sym; }else{ $oper[]=$sym; } } } } if(in_array('%',$oper)){ if(array_search('%',$oper) == '0'){ $a=$digit[0]; $b=$digit[1]; PERC($a,$b); $s="$a% от $b "; }else { $a=$digit[0]; $b=$digit[1]; PERC($a,$b); $digit[1]=$sum; $s="$b%"; } } if(in_array('*',$oper)){ $a=$digit[0]; $b=$digit[1]; INCR($a,$b); $s="$a умножить на $b"; } if(in_array('/',$oper)){ $a=$digit[0]; $b=$digit[1]; DECR($a,$b); $s="$a разделить на $b"; } if(in_array('+',$oper)){ $a=$digit[0]; $b=$digit[1]; PLUS($a,$b); $s="$a плюс $b"; } if(in_array('-',$oper)){ $a=$digit[0]; $b=$digit[1]; MINUS($a,$b); $s="$a минус $b"; } if ($sum){ sayReply("$s будет: $sum",10); }else{ sayReply("Я не понимаю $matches[2]",10); }
1 евал опасна и надо рисовать фильтрацию, а то можно такого наговорить что пол системы разнесешьfandaymon писал(а): ↑Вс июн 17, 2018 11:42 pm
При помощи eval всё-таки гораздо короче реализуется
viewtopic.php?f=23&t=2392&start=30#p82156
Более того - всякие дополнительные действия типа синуса или корня квадратного добавляются парой строчек
if (strpos($com,'квадратный корень из ')!== false) {
$com=str_replace('квадратный корень из','sqrt(',$com);
$com.=')';
}
1. Вряд ли получится случайно что-то наговорить, что разнесёт систему. Да и специально тоже маловероятно. Во всяком случае если у тебя есть доступ к системе и желание её разнести, то всё это можно проделать гораздо прощеSas писал(а): ↑Пт июн 22, 2018 12:12 am1 евал опасна и надо рисовать фильтрацию, а то можно такого наговорить что пол системы разнесешьfandaymon писал(а): ↑Вс июн 17, 2018 11:42 pm
При помощи eval всё-таки гораздо короче реализуется
viewtopic.php?f=23&t=2392&start=30#p82156
Более того - всякие дополнительные действия типа синуса или корня квадратного добавляются парой строчек
if (strpos($com,'квадратный корень из ')!== false) {
$com=str_replace('квадратный корень из','sqrt(',$com);
$com.=')';
}
2 надо предусмотреть несколько вариантов ибо не удобно говорить или писать - умножить делить
3 я рисовал эту штуку только для процентов и минус проценты - все остальное побочка, а в eval ее рисовать надо.
4 ну и уменьшить скрипт можно прилично так как я писал его за чем то для консоли, а не для $matches