обработка синтаксической ошибки php eval для математических уравнений

предположим, что я делаю это в php:

eval("\$answer=1--1;"); 

Выражение 1–1 приведет к синтаксической ошибке в eval, мой вопрос заключается в том, как определить ошибку и обработать ее изящно? т.е.: ошибка catch в eval, а затем распечатать полезное сообщение. Прямо сейчас, он просто выплевывает «Ошибка анализа: синтаксическая ошибка, неожиданный T_DEC». К сожалению, в руководстве php указано, что невозможно обнаружить ошибки разбора с помощью функции set_error_handler ().

Это для простого школьного задания, и они предложили использовать «eval ()». Поскольку назначение тривиально, возможно, нет необходимости беспокоиться об этих редких случаях.

Предварительно ожидающий символ @ для eval для подавления вывода ошибки, а затем путем проверки error_get_last() :

 $test = @eval($str); if (error_get_last()) var_dump(error_get_last()); 

Затем проанализируйте токен PHP, указанный в сообщении об ошибке (значение «сообщение» или T_DEC в вашем случае) по списку: http://php.net/manual/en/tokens.php

Тем не менее, некоторые ошибки синтаксического анализа могут вывести из строя весь ваш скрипт, например, вызвать неопределенные функции. И, поскольку вы подавили вывод ошибки, сбой не появится в ваших журналах. В принципе: избегайте eval для чего-либо другого, кроме забавной игрушки, чтобы пройти время.

Редактировать: я шел по предположению "\$answer=1--1;" на самом деле это не значение, которое вы хотите проверить (просто слишком очевидное), а просто пример тестирования того, какие строки вы можете переходить на eval. Если это действительно так, вы должны просто исправить это прямо там. Но если вы хотите передать и проверить любую строку вообще в eval, то это поможет.

  1. Подготовьте строку с чем-то вроде echo 'd41d8cd98f00b204e9800998ecf8427e'; ,
  2. Включите буферизацию вывода .
  3. Eval
  4. Получите содержимое выходного буфера и удалите его .
  5. Проверьте, начинается ли содержимое с 'd41d8cd98f00b204e9800998ecf8427e'.

Кроме того, используйте Parsekit .

Нет никакой причины использовать eval для математических уравнений.
Как есть тысячи парсеров математики вокруг. Безопасный и обслуживаемый.