public function ruleExprEvaluate($expr)
{
// Evaluate fired() conditions
$expr = preg_replace_callback('/fired\\s*\\(\\s*(\'|")(.*)\\1\\s*\\)/Ui', array($this, 'ruleExprEvaluateFired'), $expr);
// Evaluate variables
$expr = preg_replace_callback('/\\b(\\w+)\\b/', array($this, 'ruleExprEvaluateVariable'), $expr);
$value = 0;
$err = 0;
// Actually evaluate the code
ob_start();
try {
// TODO: replace by using symfony/expression-language
eval('$value = ' . $expr . ';');
$err = ob_get_contents();
} catch (Exception $e) {
// In normal operation, there is just output in the buffer,
// but when running under phpunit, error in eval raises exception
$err = $e->getMessage();
}
ob_end_clean();
// Error handling
if ($err) {
throw new Exception(strip_tags($err) . '<br />Executed code: $value = ' . htmlspecialchars($expr) . ';');
}
return $value;
}