2016-03-26 3 views
0

Я пытаюсь написать функцию PHP, чтобы проверить, представляет ли строка математическое выражение.PHP Проверяем, что строка является математическим выражением

Это то, что у меня есть:

function is_math($maybe_math){ 
    $pattern = '([-+]?[0-9]*\.?[0-9]+[\/\+\-\*])+([-+]?[0-9]*\.?[0-9])'; 
    if(0 === preg_match($maybe_math, $pattern)){ 
     return true; 
    } 
} 

Я тестирую с этими возможностями:

$valid = is_math('(1-4*(9*5/1)+1)'); //true 
$invalid = is_math('hats' ); //false 
$valid_and_invalid = is_math('(1-4aaa*(9*5/1)+1k)'); //true 

Как вы можете видеть, насколько он оценивает верно для математического выражения или строка с действительные математические символы и недопустимые математические символы. В настоящий момент третий тест, который я показываю, должен быть ложным, поскольку в нем есть буквы, и я не занимаюсь здесь алгеброй.

Моя цель здесь заключается в создании функции, которую я могу использовать для проверки того, что моя строка может быть передана в eval и вернуть номер и не подвергать риску выполнение небезопасного кода, поскольку эти числа частично относятся к данным POST.

+0

Итак, в чем проблема сейчас? – Rizier123

+2

Возможный дубликат [Соответствие математическому выражению с регулярным выражением?] (Http://stackoverflow.com/questions/2595254/matching-math-expression-with-regular-expression). Проверьте ответ с помощью php-решения: http://stackoverflow.com/a/2596378/2253302 –

+0

используйте функцию php eval и да, этот вопрос повторяется – Saleem

ответ

0

Ваша основная проблема заключается в том, что вы смотрите только на наименьшую возможную подстроку, а не на все выражение.

Вы можете see for yourself, что соответствует этим выражениям.

Первого шаг должен были бы обернуть выражение в начальных и конечных матчах (^ и $, соответственно), включает в свой полный набор допустимых символов (не имеют аналогов для ( или ), например) и идти оттуда ,

Но на самом деле это поручение дурака. Регулярное выражение не предназначено для анализа математических выражений; есть определенная учебная ценность для этого упражнения, но в конечном итоге это просто не может быть сделано хорошо.

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