首先,我只想说我从未理解正则表达式模式,但我正在进步:)
我想创建一个函数来替换“^”char和左边的匹配pow($ 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))'”最终它无法正常工作。
基本上我希望preg_replace从左边找到第一个“()”& “^”字符
右边的第一个“()”它应该如何工作的例子(我只会在“^”的左侧做,但它也适用于右侧)
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.如果第一件事是“)”搜索它的对“(并返回其中的所有内容(类似'/(/([.*]))\^/')
我很抱歉我的英语,我希望你能理解......我希望有人可以帮助我解决这个问题:(
提前致谢!
答案 0 :(得分:3)
这里的问题是你需要一个解析器。无限嵌套表达式(如括号中)不能单独使用正则表达式匹配 1 。考虑一下:
(2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (2 ^ (...)))))))
正则表达式会匹配什么?你可以近似它,你可以匹配N级,但你不能做到这一切。
你应制作解析器。如果你不想,我明白,因为这是很多工作。您现在可以获得足够好的正则表达式解决方案。但它不会永远有效,因为正则表达式不足以解决这个问题。