2012-03-22 4 views
4

私は、たとえば、この文字列を持っている:PHPで文字列が数学的な文であるかどうかを調べる方法は?

"2 + 2 - 2"と評価されたとき、それはint(2)を返す必要がありますが、

私は、関数/パーサーの魔女が、数学のコンテンツのanykindが文字列内で一致するかどうかを調べることができます探しています。より多くの例:

"(2 + 2)/2" 
"(4/8) * 12" 
"128 * 8" 

は、これらの数学式を評価して計算する必要はありません、ただ文は、この数学の種類のものである場合、関数の魔女は、(True/False戻り値)を決定します必要があります。

これは正規表現などで可能ですか?ありがとう!

+4

「数学的ステートメント」を定義します。 –

+0

文字列の魔法使いには、「=」以外の/、*、+、 - のいずれかの数学的オペランドが含まれています。私はそれを処理しました... –

+1

はい、* "数学的声明" *を定義します。少なくとも、「算術声明」*を意味しますか? – sch

答えて

0

evalを参照してください。任意のPHPコードが評価されるためだけで、気をつけて

$result = INF; 
try { 
    eval("$result=" + myMathExpression); // Evaluate here 
} catch (Exception $e) { 

} 
if($result != INF) echo("Expression is a valid mathematical expression."); 

:たとえば、あなたはこれを行うことができます!

+2

私は、誰かが適切な数式を入力したかどうかを評価したいと思います。それを 'eval()'に直接入れることは自殺です。 – devsnd

+1

私はあなたの例を使用して、それは動作します。私はここでは "eval"機能に関してセキュリティホールを残していることを知っていますが、後でそれを気にします。 :) ありがとうございました。 –

+1

"後で気をつけてください"という決して良い選択肢はありません。 '/^[0-9 \ + \ - \ * \ /()] + $ /'のような、有効な文字だけがあるかどうかを調べる何らかの正規表現を使うことをお勧めします。後で、今すぐ後ろに穴を開ける代わりに、それを改良することができます。 – devsnd

1

実行時にphpとして実行し、応答値が数値として戻ってくるかどうかを確認してください。これをみて。 http://php.net/manual/en/function.eval.php

+2

これは、あなたがこの方法で任意のPHPを実行できるとすれば、悪い考えのように思えます。 –

+0

はい、少し安全ではありませんが、数字を入力して特定の記号のみをテストするために入力を囲む正規表現を使用すると、合計を戻す最良の方法になる可能性があります。それが最終的に要件になる場合は、より良い数学関数にも拡張するのに便利かもしれません。 – Luc

0

解析する式の種類がわかっている場合は、正規表現を使用できます。 ^\d+\s*(\+|-|\*|\\)\s*\d+のようなものは、+,*,-および\のバイナリ演算子を検証しようとすると真となるはずです。したがって、3 + 3,2 - 0などの項目を検証します。

0

XPフレームワークのパーサージェネレータを使用できます。 電卓の場合はsample grammarを参照してください。これはPHPコードに翻訳することができます。

関連する問題