PHP - Помощь с регулярным выражением? - PullRequest
0 голосов
/ 09 ноября 2010

Я бы не назвал себя мастером в области регулярных выражений, я просто знаю основы.Я играл с этим, но я не могу получить желаемый результат.Так что, если кто-нибудь мне поможет, я был бы очень признателен!

Я пытаюсь проверить, есть ли в строке нежелательные слова.Я работаю над математическим проектом, и я буду использовать eval () для вычисления строки, поэтому мне нужно убедиться, что она безопасна.

Строка может содержать (например, теперь яПозже я добавлю больше функций) следующие слова: (прочитайте комментарии)

floor() // spaces or numbers are allowed between the () chars. If possible, i'd also like to allow other math functions inside, so it'd look like: floor( floor(8)*1 ).
It may contain any digit, any math sign (+ - * /) and dots/commas (,.) anywhere in the string

Просто для ясности, вот еще один пример: если строка, подобная этой, передана, я не хочу, чтобы это прошло:

9*9 + include('somefile') / floor(2) // Just a random example on something that's not allowed

Теперь, когда я думаю об этом, это выглядит довольно сложно.Я надеюсь, что вы, по крайней мере, можете дать мне несколько советов.

Заранее спасибо, -Антони

Редактировать: Это немного не по теме, но если вы знаете лучший способ вычисления математических функцийПожалуйста, предложите это.Я искал безопасный математический класс / функцию, которая вычисляет входную строку, но я еще не нашел ее.

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Пожалуйста, не используйте eval () для этого.

Мой стандартный ответ на этот вопрос, когда он возникает:

Не используйте eval (особенно, если формула содержит вводимые пользователем данные)или заново изобрести колесо, написав собственный анализатор формул.

Взгляните на класс evalMath в PHPClasses.Он должен делать все, что вы хотите в хорошей безопасной песочнице.

0 голосов
/ 09 ноября 2010

Чтобы перефразировать вашу проблему, вы хотите разрешить только определенный набор символов, а также определенные предопределенные слова. Оператор чередования (символ трубы) является вашим другом в этом случае:

([0-9\+\-\*\/\.\,\(\) ]|floor|ceiling|other|functions)*

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

...