Прежде всего, я просто хочу сказать, что я никогда не понимал так хорошо шаблоны регулярных выражений, но я прогрессирую:)
Я хочу создать функцию для замены символа «^» и оставилправильные совпадения с пау ($ 1, $ 2).Мне удалось добраться до точки, которая является приемлемой, но строка, которую я получаю от API, становится все больше и больше, и теперь я застрял ... это так:
$str = '(0+1*9^3+3)*(4+5)-(6/7)+(1+2)/(1+1)^((2/3)*3-1+(2/3))';
$str = preg_replace('/([0-9]+|\([0-9\+\-\*\/]+\)|[^\+\-\*\/]\([\S]+\))\^([0-9]+|\([0-9\+\-\*\/]+\)|[^\+\-\*\/]\([\S]+\))/', 'pow($1,$2)', $str);
echo $str;
Это работает нормально, чтобызаданная строка, но если я добавлю еще 1 "+ (1 + 2) / (1 + 1) ^ ((2/3) * 3-1 + (2/3))" до конца, это не сработаетright.
В основном я хочу, чтобы preg_replace находил первый "()" слева и первый "()" справа от "^" char
Примеры того, как это должно работать(Я сделаю это только для левой части «^», но это также относится и к правой стороне)
3+2^3-2 => 3+pow(2, 3)-2
3+(1+1)^3*2 => 3+pow((1+1), 3)*2
3+(1+1+(1+2))^3/2 => 3+pow((1+1+(1+2)), 3)/2
3+((3/3)+(2/2))^2-1 => 3+pow(((3/3)+(2/2)), 2)-1
(3+1)^3-1 => pow((3+1), 3)-1
и т.д ...
Сортировка для всего вышеперечисленного:вернуть как «$ 1» то, что находится перед «^»: 1. если первое, что перед «^» - это int, вернуть число 2., если первое - «),« найти его пару »(« и вернуть все внутри них »(что-то вроде '/(/([.*]))\^/')
Извините за мой английский, надеюсь, вы поняли ... и я надеюсь, что кто-то может помочь мне в этомпроблема: (
Заранее спасибо!