3

PHPで文字列を解釈し、簡単な数学計算を実行して、式がtrueかfalseかについてブール結果を返すことができるものを探しています。

例えば:

  1. 「3*{mysalary} / 9=10000」のタイプを訴える
  2. PHPは、これを2つの式に分割します-explode('='、string);
  3. PHPはデータベースフィールドのリストを取得し、「{}」で区切られたフィールドをデータ(intにタイプキャスト)に置き換えます。
  4. 次に、PHPは数式を評価します
  5. 次に、phpは左側と右側を比較します
  6. ブール結果が生成されました。

複雑に聞こえるかもしれませんが、必要なのは非常に単純なことだけです。制約は次のとおりです。1/数学演算子は次のように固定されます:+-/ * 2 /比較演算子は次のように固定されます:=> <> = <= 3 /浮動小数点比較は必要ありません。すべて、整数レベルで実行できます。したがって、必要に応じて、または単に最終結果を丸めるだけで、任意の除算を丸めることができます。

1つの比較演算子を使用して、式は2つだけになります。なんらかのエラーが発生した場合は、falseを返します。

誰かがすでにこれを行うことができる何かを見たことがありますか?私は何かを作ることができることを知っていますが、なぜ車輪の再発明を正しく行うのですか?

何も見たことがない場合は、これを作成するときに考えられる「落とし穴」または警告をいくつか挙げてください。

もう少し読んだ後、私は操車場アルゴリズムを使用できることに気付きました。PHPでこれを実装している人はいますか?

evalはこれを実行する簡単な方法である可能性があることは承知していますが、ユーザーがこの方法を使用して何かを簡単に壊したり、構文エラーを引き起こしたりする可能性があるのではないかと心配しています。ソリューションに含めたくない、または含める場合は、使用方法を厳密に制御する必要があります。

ありがとう。

ジェイソン

4

4 に答える 4

2

PHPClassesのevalMathクラスを見てください。これにより、変数の置換(式を評価する前に例で「mysalary」の値を設定するなど)を含め、必要なほとんどすべてのことが実行されます。

于 2010-09-08T07:52:08.390 に答える
2

github Xpresion(ps。私は作者です)に式パーサーエンジンJavaScript + NodePHPPython、ActionScriptの実装)があります

エンジンは非常に柔軟で構成可能であり、ユーザー定義変数ユーザー定義関数多態演算子、および一般的なn-ary演算子(たとえば、ternary if-then-else)を含む任意の式を解析するパーサーを作成できます。

アルゴリズムは非常に一般的です(たとえば、操車場アルゴリズムの一般化されたバリエーション)

于 2015-01-26T22:08:17.510 に答える
0

私が取るアプローチは次のとおりです。

  1. 式をトークン化する
  2. 抽象構文木に解析します
  3. 変数の置換を実行します(先行評価を参照)
  4. 結果を計算する

今...

  • 操車場アルゴリズムは、ステップ1と2を実行する方法です。
  • 2番目のステップの後で、式が構文的に正しいかどうかを確認できます
  • 結果の計算方法は、ASTの構築方法によって異なります。

最も難しいステップは2番目です。演算子の優先順位、括弧などを考慮する必要がありますが、それに関する文献はたくさんあります(ウィキペディアのリンクをたどることもできます)

于 2010-09-08T01:54:52.237 に答える
0

変数の置換を実行してから、を実行してから、またはのいずれかpreg_replace("/[^0-9+-*\/]/", '', $inputString)を使用しないのはなぜですか?これを使用する場合は、安全でない可能性のある「ステートメント」が削除されていることを確認する必要があります。そのため、preg_replaceを使用したため、リテラル文字列が削除されます。eval()create_function()

于 2010-09-08T09:17:58.687 に答える