2009-08-19 11 views
0

PHPで生成されたフォームに入力された測定値を検証する必要があります。PHPで測定を検証

私はそれらを上限と下限の対照限界と比較し、それらが失敗するかどうかを判断するつもりです。

最初のステップとして、エンジニアリング測定値を表す文字列を受け取り、比較前に純粋な数値に変換するPHP関数を想像します。

現時点では私は、小さな電圧と電流の測定結果を期待して

'1.234uA' のような文字列ので、 '2.34 nAの'、'39 .9mV」です。または

'-1.003e-12' は、それぞれ

1.234E-6、2.34e-9、3.99e-2及び-1.003e-12に変換されます。

しかし、この方法は測定量に対して一般化可能でなければなりません。あなたの関数で

答えて

1
function convert($value) { 
    $units = array('p' => 'e-12', 
        'n' => 'e-9', 
        'u' => 'e-6', 
        'm' => 'e-3'); 
    $unitstring = implode("", array_keys($units)); 
    $matches = array(); 
    $pattern = "/^(-?(?:\\d*\.\\d+)|(?:\\d+))\s*([$unitstring])([a-z])$/i"; 
    $result = preg_match($pattern, $value, $matches); 
    if ($result) 
     $retval = $matches[1].$units[$matches[2]].$matches[3]; 
    else 
     $retval = $value; 
    return $retval; 
} 

ので、上記が何をするかを説明します

  • $単位は指数にユニット・プレフィックスをマップするための配列です。
  • $ unitstringはユニットを1つの文字列に集約します(この例では 'pnum'になります)
  • 正規表現はオプションの - と0以上の数字、ピリオド、1桁以上の数字または1つ以上の数字と、それに続く1つの単位プレフィックス(1つだけ)と、その後の1つのアルファベット文字。数字と単位の間には、任意の量の空白を入れることができます。
  • preg_matchの使用と使用のために、数字セクション、ユニット接頭辞、およびユニットはすべて、配列$ matchで要素1,2および3として別々に取得されます。(0には文字列全体が含まれます)
  • $結果は、正規表現と一致する場合は1、そうでない場合は0になります。
  • $ retvalは、数値、指数(配列からのユニット接頭辞に基づく)、提供される単位を接続するだけで構築されます。または、文字列で渡されます(-1.003 e-12、それは返されます)

もちろん、あなたはいくつかのものを微調整することができますが、これは一般的には良いスタートです。それが役に立てば幸い。

+0

はい、ありがとうございました。連想配列は、ユニット接頭辞と指数の関係を明らかにしますが、次のコードの複雑さが増します。 私の実際の実装では、スペースを削除して1.23uAのような文字列が1.23e-6になった追加のpreg_replaceが含まれていると思います。 これはうまくいくようでしたが、 – pavium

+0

ありがとうございます。ここで複雑さが増すのは、正規表現自体だけです。 preg_replaceは単なるpreg_matchよりも高価になります。それでは、スピードとパフォーマンスのために行くなら、なぜPHPを使用していますか? = Pあなたが一度に多数のものを変換しているのでなければ(私が疑うフォームから入力を受けている場合)、複雑さのコストはおそらく無視できる程度です。 – Zeroshade

+0

速度と性能について大きな心配はありません:私は、ピコアンペアとマイクロボルトの違いを必ずしも知らないオペレータがフォームに入力した10回の測定を検証しています。 私が言及したコストは、私があなたの正規表現の周りに頭を抱いている間に耐えなければならなかった増加した精神活動です。しかし私は新しいものを学ぶのが好きです。あなたの提案をありがとう。 – pavium

0


まずあなたは、uのための-6のような単位の値を初期化する必要が-3メートルのために...など
除算数値と単位(すなわちマイクロ(U)、ミリ(M内の文字列)、等)。
と入力し、入力した番号はNUMです。 unitはUNIT ..(u、mなどのようなchar);

while(NUM>10) 
{ 
NUM=NUM/10; 
x++; //x is keeping track of the DOT. 
} 
UNIT=UNIT+x; //i.e UNIT is increased(for M,K,etc) or decreased(for u,m,etc) 
echo NUM.e.UNIT; 

することもあります。

+0

ありがとう、Pradyumna、ちょうど2人が同じ方法で問題を解決することはないことを示しています。 – pavium

0

私自身の可能性シンプル志向のアプローチはにpreg_replaceで

function convert($value) { 
    $result = preg_replace($patterns, $replacements, $value); 
    return $result; 
} 

どこ

$patterns = array('/p[av]/i', '/n[av]/i', '/u[av]/i', '/m[av]/i'); 
$replacements = array('e-12', 'e-9', 'e-6', 'e-3'); 

のパターンの配列を使用するようにされていて、それが高いプレフィックスに拡張することができ、それは重そうですますます複雑な正規表現を$ patterns配列に追加し続けています。

編集:比較は、後で、戻り値を実数として解釈する必要があります。

私は誰かがよりエレガントなものを提案できると思っています。