pow için regex ()

0 Cevap php

Öncelikle Ben sadece çok iyi düzenli ifadeler desenleri anladım asla söylemek istiyorum, ama ben ilerliyor ediyorum :)

Birazdan pow ($ 1, $ 2) ile eşleşen "^" karakter değiştirilmesi ve sol için bir işlev oluşturmak istiyorum. Ben kabul edilebilir bir noktaya ulaşmak için manged ama bir API aldığınız dize daha büyük ve olmaya devam ediyor Daha büyük ve şimdi ben şaşırıp ... bu gibi:

$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;

Bu verilen dize ok çalışıyor ama sonuna "+ (1 +2) / (1 +1) ^ ((2/3) * 3-1 + (2/3)) '" 1 daha eklerseniz doğru çalışmıyor.

Temelde i preg_replace soldan ilk "()" bulmak istiyorum & "^" karakter hakkından "()" ilk

Nasıl çalışması gerektiğini örnekleri (yalnızca "^" sol tarafı için yaparım ama olabilir sağ tarafında de geçerlidir)

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

vs ..

Sort for all above is: return as "$1" what is before "^": 1. if the first thing before "^" is int, return the number 2. if the first thing is ")" search for it's pair "(" and return everything inside them (something like '/(/([.*]))\^/')

Ben, ben seni anladım, benim İngilizce için üzgünüm umut ediyorum ... ve ben birisi bu sorunu bana yardımcı olabilir umuyoruz: (

Şimdiden teşekkürler!

0 Cevap