PHP递归正则表达式循环无限期

PHP递归正则表达式循环无限期,php,regex,Php,Regex,我必须验证数学表达式中的语法,如: (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[\(]

我必须验证数学表达式中的语法,如:

(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
我想解释一下我是如何解决这个问题的

我认为在这个正则表达式中,'xas'或'sax'

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    

看,我明白问题是锚,但我不明白如何解决这个问题,你能帮我吗?有人能给我解释一下这个问题吗?我确信问题出在锚上。