2012-11-28 2 views
-2

я следующий код:PHP ошибка Eval синтаксического анализа

<?php 
function calculate_string($mathString) { 
    $mathString = trim($mathString);  // trim white spaces 
    $mathString = preg_replace("/[^0-9\(\)\+\-\*\/\.]/", "", $mathString);  
    return eval("return $mathString;"); 
} 

$string1 = " (1 + 1) *3+ (2 + 2)"; 
echo calculate_string($string1); 
$string2 = " (1 + 1) *3+* (2 + 2)"; 
echo calculate_string($string2); 
?> 

функция calculate_string() необходимо вычислить математическое выражение, приведенное в строке как парам. Первый вызов string1 работает хорошо.

Но, как я могу определить, если математика. строка имеет математику. ошибка в синтаксисе, как во втором вызове, и возврат некоторого значения зависит от типа ошибки или простого возврата ничего (лучшее решение)? Итак, проблема заключается в parse_error во втором вызове, когда выражение math содержит ошибки в синтаксисе.

Пожалуйста, помогите.

+1

Почему у вас есть все эти escape-последовательности в регулярном выражении? 'preg_replace ('~ [^ 0-9() * /. + -] ~', '', $ mathString)' is * точно * эквивалентно тому, что у вас есть сейчас, но гораздо читабельнее. – NullUserException

+0

Вы должны изучить использование текстового редактора подсветки синтаксиса, такого как Notepad ++ или JEdit, поможет вам уловить ошибки синтаксического анализа, так как он сломает подсветку синтаксиса в источнике ошибки. –

+2

* «Как я могу определить, есть ли математическая строка с математической ошибкой в ​​синтаксисе» * Напишите правильный парсер вместо использования 'eval()'. – NullUserException

ответ

0

Итак, вы хотели бы что-то вроде спорта *3+* в:

$string2 = " (1 + 1) *3+* (2 + 2)"; 

Ну вы можете сделать это во многих отношениях, проверяя строку себя для некоторых распространенных ошибок, или путем проверки eval() «s возвращаемого значения (docs):

в РНР 7, если есть ошибка синтаксического анализа в оцениваемом коде, Eval() генерирует исключение ParseError. До PHP 7 в этом случае eval() вернул FALSE, и выполнение следующего кода продолжалось нормально. Невозможно поймать ошибку разбора в eval(), используя set_error_handler().

+1

Вы не можете использовать 'set_error_handler()', чтобы ловить ошибки в коде 'eval''d. Источник: [docs] (http://php.net/manual/en/function.eval.php) – NullUserException

+0

Правда. Исправленный –

 Смежные вопросы

  • Нет связанных вопросов^_^