fork download
  1. <?php
  2. //PHP regex recursivo
  3. // https://pt.stackoverflow.com/q/200254/53463
  4.  
  5. function validar($expr) {
  6. $oper = '[-+*\/]'; //um operador matemático
  7. $numero = '(?:- ?)?\d*\.?\d+'; //float
  8. $nomes = '(?:var|perg|ind)'; //nomes de função
  9.  
  10. $recurse= '(?1)';
  11.  
  12. $parens = '\(' . $recurse . '\)';
  13. $funcao = "$nomes?$parens";
  14.  
  15. $x = "(?:$numero|$funcao)";
  16. $s = $x . "(?:$oper$recurse)*";
  17.  
  18. $regex = "/^($s)$/";
  19. //=> /^((?:(?:- ?)?\d*\.?\d+|(?:var|perg|ind)?\((?1)\))(?:[-+*\/](?1))*)$/
  20.  
  21. return preg_match( $regex, $expr);
  22. }
  23.  
  24.  
  25. // EXEMPLOS
  26. $exemplos = [
  27. '9-8+',
  28. '(ind(10)+15)-10',
  29. '(ind(10)+15-10',
  30. '1000-(perg(25)*2)',
  31. '1000-perg(25)*2)',
  32. '1000-perg(25)*2',
  33. '25/var(1)',
  34. '12*2-(58+1)/5',
  35. '(perg(6)*perg(4)*)*1000000',
  36. '0'
  37. ];
  38.  
  39. foreach ($exemplos as $expressao) {
  40. echo (validar($expressao) ? '✔️' : '✖️') . " $expressao\n";
  41. }
Success #stdin #stdout 0.01s 82944KB
stdin
Standard input is empty
stdout
✖️ 9-8+
✔️ (ind(10)+15)-10
✖️ (ind(10)+15-10
✔️ 1000-(perg(25)*2)
✖️ 1000-perg(25)*2)
✔️ 1000-perg(25)*2
✔️ 25/var(1)
✔️ 12*2-(58+1)/5
✖️ (perg(6)*perg(4)*)*1000000
✔️ 0