<?php
//PHP regex recursivo
// https://pt.stackoverflow.com/q/200254/53463
function validar($expr) {
$oper = '[-+*\/]'; //um operador matemático
$numero = '(?:- ?)?\d*\.?\d+'; //float
$nomes = '(?:var|perg|ind)'; //nomes de função
$recurse= '(?1)';
$parens = '\(' . $recurse . '\)';
$funcao = "$nomes?$parens";
$x = "(?:$numero|$funcao)";
$s = $x . "(?:$oper$recurse)*";
$regex = "/^($s)$/";
//=> /^((?:(?:- ?)?\d*\.?\d+|(?:var|perg|ind)?\((?1)\))(?:[-+*\/](?1))*)$/
}
// EXEMPLOS
$exemplos = [
'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'
];
foreach ($exemplos as $expressao) {
echo (validar($expressao) ? '✔️' : '✖️') . " $expressao\n";
}
PD9waHAKCS8vUEhQIHJlZ2V4IHJlY3Vyc2l2bwoJLy8gaHR0cHM6Ly9wdC5zdGFja292ZXJmbG93LmNvbS9xLzIwMDI1NC81MzQ2MwoKCWZ1bmN0aW9uIHZhbGlkYXIoJGV4cHIpIHsKCQkkb3BlciAgID0gJ1stKypcL10nOyAgICAgICAgICAgLy91bSBvcGVyYWRvciBtYXRlbcOhdGljbwoJCSRudW1lcm8gPSAnKD86LSA/KT9cZCpcLj9cZCsnOyAvL2Zsb2F0CgkJJG5vbWVzICA9ICcoPzp2YXJ8cGVyZ3xpbmQpJzsgIC8vbm9tZXMgZGUgZnVuw6fDo28KCQkKCQkkcmVjdXJzZT0gJyg/MSknOwoJCQoJCSRwYXJlbnMgPSAnXCgnIC4gJHJlY3Vyc2UgLiAnXCknOwoJCSRmdW5jYW8gPSAiJG5vbWVzPyRwYXJlbnMiOwoJCQoJCSR4ID0gIig/OiRudW1lcm98JGZ1bmNhbykiOwoJCSRzID0gJHggLiAiKD86JG9wZXIkcmVjdXJzZSkqIjsKCQkKCQkkcmVnZXggPSAiL14oJHMpJC8iOwoJCQkgLy89PiAvXigoPzooPzotID8pP1xkKlwuP1xkK3woPzp2YXJ8cGVyZ3xpbmQpP1woKD8xKVwpKSg/OlstKypcL10oPzEpKSopJC8KCQkKCQlyZXR1cm4gcHJlZ19tYXRjaCggJHJlZ2V4LCAkZXhwcik7Cgl9CgkKCQoJLy8gIEVYRU1QTE9TCgkkZXhlbXBsb3MgPSBbCgkJCSc5LTgrJywKCQkJJyhpbmQoMTApKzE1KS0xMCcsCgkJCScoaW5kKDEwKSsxNS0xMCcsCgkJCScxMDAwLShwZXJnKDI1KSoyKScsCgkJCScxMDAwLXBlcmcoMjUpKjIpJywKCQkJJzEwMDAtcGVyZygyNSkqMicsCgkJCScyNS92YXIoMSknLAoJCQknMTIqMi0oNTgrMSkvNScsCgkJCScocGVyZyg2KSpwZXJnKDQpKikqMTAwMDAwMCcsCgkJCScwJwoJCV07CgkJCglmb3JlYWNoICgkZXhlbXBsb3MgYXMgJGV4cHJlc3NhbykgewoJCWVjaG8gKHZhbGlkYXIoJGV4cHJlc3NhbykgPyAn4pyU77iPJyA6ICfinJbvuI8nKSAuICIgJGV4cHJlc3Nhb1xuIjsKCX0=