PHP preg_match Math Function - PullRequest
1 голос
/ 27 мая 2010

Я пишу скрипт, который позволит пользователю вводить строку, которая является математическим оператором, чтобы затем быть оценена. Я однако попал в контрольно-пропускной пункт. Я не могу понять, как с помощью preg_match отклонять операторы, в которых есть переменные.

Используя это, $calc = create_function("", "return (" . $string . ");" ); $calc();, пользователи могут вводить строку, которая будет оценена, но она падает, когда вместо переменной $string.

ставится что-то вроде echo 'foo';.

Я видел этот пост , но он не допускает математических функций внутри строки, таких как $string = 'sin(45)';.

Ответы [ 4 ]

1 голос
/ 27 мая 2010

Для стекового парсера, реализованного в PHP, который использует алгоритм шунтирования ярда Джикстры для преобразования инфикса в постфиксную нотацию и с поддержкой функций с различным числом аргументов, вы можете посмотреть на источник для PHPExcel Расчетный движок (и который не использует eval)

Также посмотрите на ответы на этот вопрос

0 голосов
/ 27 мая 2010

Интересно, поможет ли вам этот класс ? Обнаружил, что делает поиск в Google по запросу " php math expression ".

0 голосов
/ 27 мая 2010

Что-то вроде:

^([\d\(\)\+\-*/ ,.]|sin\(|cos\(|sqrt\(|...)+$

разрешает только цифры, скобки, математические операции и предоставляемые математические функции. Но он не будет проверять правильность указанного выражения, поэтому что-то вроде +++sin()))333((( все равно будет принято.

0 голосов
/ 27 мая 2010

Насколько сложную математическую функцию вам нужно разрешить? Если вам нужна только базовая математика, то вам, возможно, удастся избежать использования только пробела + символов 0123456789.+/-* или некоторых подобных.

В целом, однако, использование возможностей языка eval -типа просто для математики, вероятно, плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...