1

sin、cosなどの関数を含む、数式を評価する関数をPHPで作成しようとしています。私のアプローチは、フレーズ内の数値、数学演算子、または数学関数ではないすべての文字を削除することです。次に、その文字列を eval() で使用します。問題は、正規表現について、同じ表現内の文字と句の両方を否定するのに十分な知識がないことです。

これまでのところ、これは私が持っているものです:

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

明らかに、sin、cos、および tan の文字は、(sin、cos、および tanというフレーズのみを許可するのではなく) 入力式で任意の順序で使用できます。この関数をさらに拡張してさらに多くの文字や関数を含めると、悪意のあるユーザーがアプリとの巧妙なやり取りを通じてほぼすべての PHP コマンドを実行できるため、セキュリティ リスクがさらに大きくなります。

正規表現を修正してこの問題を解決する方法を誰か教えてもらえますか?

4

2 に答える 2

1

sin、cosなどの関数を含む、数式を評価する関数をPHPで作成しようとしています

PHPExcelに、既に数式パーサーが含まれています。

cossinおよび他の何百ものものが含まれます。

それ以外の場合は、否定するのではなく、肯定的な一致を探すことができます。

$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) 
*/
于 2010-10-07T17:16:16.147 に答える
0

これを試すことができます:

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

ideone.com のコード

しかし、式を解析して評価しようとしている場合は、単に正規表現パターンを介して渡すのではなく、解析することをお勧めします。

于 2010-10-07T17:02:01.813 に答える