Исключение всех символов НЕ в списке и НЕ в списке фраз - PullRequest
1 голос
/ 07 октября 2010

Я пытаюсь создать в PHP функцию, которая будет оценивать математическое выражение, включая такие функции, как sin, cos и т. Д. Мой подход заключается в удалении всех символов в фразе, которые не являются числами, математическими операторами илиматематические функции, а затем использовать эту строку в eval ().Проблема в том, что я не знаю достаточно о регулярных выражениях, чтобы отрицать как символы, так и фразы в одном и том же выражении.

До сих пор это то, что я получил:

$input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input);

Очевидно, что символы для sin, cos и tan могут использоваться в любом порядке во входном выражении (вместо only , допускающих фразы sin, cos и tan).Если я продолжу расширять эту функцию, включив в нее еще больше символов и функций, это представляет еще большую угрозу безопасности, поскольку злонамеренный пользователь сможет выполнить практически любую команду PHP через умное взаимодействие с приложением.

Может кто-нибудьподскажите, как исправить мои регулярные выражения и устранить эту проблему?

Ответы [ 2 ]

1 голос
/ 07 октября 2010

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

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

Она включает cos, sin и сотни других.

В противном случае,вместо отрицания вы можете искать положительные совпадения:

$matches = array();
preg_match_all("#([0-9,/\*()+\s\.-]|sin|cos)+#", 'sin(12) + cos(13.5/2) evddal * (4-1)', $matches);
echo implode('', $matches[0]);

/* output:
sin(12) + cos(13.5/2) * (4-1) 
*/
0 голосов
/ 07 октября 2010

Вы можете попробовать это:

preg_replace("/(sin|cos|tan)?[^0-9+\\.*\/()-]/", "$1", $input);

код на ideone.com

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

...