/ / PHP - Помощ при regex? - php, регекс, математика, eval

PHP - Помощ за регекс? - php, regex, математика, eval

Не бих се нарекъл майстор по отношение на регекс,аз почти просто знам основите. Играя си с нея, но не мога да получа желания резултат. Така че, ако някой би ми помогнал, наистина бих го оценил!

Опитвам се да проверя дали съществуват нежелани думи в низ. Аз работя по математически проект и ще използвам 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

Сега като се замисля, изглежда доста сложно. Надявам се поне да ми дадете някакви намеци.

Благодаря предварително, -Anthony

Редактиране: Това е малко извън темата, но ако знаете по-добър начин за изчисляване на математическите функции, моля, предложете го. Търсих безопасен математически клас / функция, който изчислява входния низ, но все още не съм намерил такъв.

Отговори:

1 за отговор № 1

Моля, не използвайте eval () за това.

Стандартният ми отговор на този въпрос винаги, когато порасне:

Не използвайте оценка (особено ако формулата съдържа потребителски вход) или преоткрийте колелото, като напишете свой собствен анализатор на формули.

Обърнете внимание на evalMath клас на PHPClasses. Трябва да направи всичко, което искате, в хубава безопасна пясъчна кутия.


0 за отговор № 2

За да преформулирате проблема си, искате да разрешите само определен набор от знаци, плюс определени предварително определени думи. Операторът на редуване (символ на тръбата) е ваш приятел в този случай:

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

Разбира се, използването на eval е само по себе си опасно и е трудно да се гарантира, че този регекс ще предложи пълна защита на език със синтаксис, толкова широк като PHP.