我必须从数学表达式验证语法,如:
(ind(10)+15)-10
1000-(perg(25)*2)
25/var(1)
12*2-(58+1)/5
ind,perg和var是函数。
所以,我试试这个:
$var = '(\((var[\(])[0-9]+\)\)|(var[\(])[0-9]+\))';
$perg = '(\((perg[\(])[0-9]+\)\)|(perg[\(])[0-9]+\))';
$ind = '(\((ind[\(])[0-9]+\)\)|(ind[\(])[0-9]+\))';
$number = '[0-9]+(\.|,){0,1}[0-9]{0,2}';
$ope = '(\+|\-|\*|\/)';
$x = '('.$ind.'|'.$var.'|'.$perg.'|'.$number.')';
$a = $ope;
$s = '/^('.$x.$a.'(?R)|\('.$x.$a.'(?R)\)|(?R)'.$a.$x.'|\((?R)'.$a.$x.'\)|'.$x.')$/';
print_r(preg_match($s, '(perg(6)*perg(4)*)*1000000'));
它抛出了这个错误:
Warning: preg_match(): Compilation failed: recursive call could loop indefinitely at offset 359
我将尝试解释我是如何制作此解决方案的。
我虽然在这个正则表达式中:' X A S'或者' S A X'
X-> Values;
A-> math operator;
S-> a subexpression.
A-> + or - or * or /;
X-> ind(NUMBER) or perg(NUMBER) or ind(NUMBER) or NUMBER_FLOAT;
S-> X A S or (X A S) or S A X or (S A X) or X