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

时间:2017-04-20 20:26:30

标签: 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[\(])[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    

0 个答案:

没有答案