2009-08-19 31 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將單元集成爲單個字符串(在本例中爲'pnum')
  • 正則表達式將匹配可選的 - ,後跟0或更多數字,一個句點和一個或多個數字或者1個或多個數字,後跟一個單位前綴(僅一個),然後是單個字母字符。數字和單位之間可以有任意數量的空白。
  • 由於paghesis和preg_match的使用,數字部分,單位前綴和單位都在數組$匹配元素1,2和3中分別捕獲。(0將包含整個字符串)
  • $ result如果匹配正則表達式則爲1,否則爲0。
  • $ retval是通過連接數字,指數(基於數組中的單位前綴)和提供的單位來構造的,或者它只是傳入的字符串(例如,如果給出-1.003它將被退回)

當然你可以調整一些事情,但總的來說這是一個好的開始。希望能幫助到你。

+0

是的,謝謝Zeroshade。關聯數組當然清楚了單位前綴和指數之間的關係,但是下面代碼的複雜性增加可能會帶來成本。 我認爲我的實際實施包括一個額外的preg_replace刪除空間,使像1.23 uA這樣的字符串變成1.23e-6 它似乎工作正常,但我真的很喜歡你的關聯數組的可讀性。 – pavium 2009-08-20 10:38:20

+0

謝謝。正則表達式本身是唯一大大增加的複雜性。 preg_replace將比preg_match更昂貴。再說一次,如果你想要提高速度和性能,你爲什麼要用php? = P除非你一次轉換大量的這些數據(如果你從我懷疑的表單獲得輸入),複雜性的成本可能可以忽略不計。 – Zeroshade 2009-08-20 13:20:17

+0

對速度和性能沒有太大的擔心:我只是驗證了10位操作員輸入表單的測量結果,他們並不一定知道皮安和微伏之間的差異。 我提到的成本是在我的頭部圍繞着你的正則表達式時,我不得不忍受的增加的心理活動。但我喜歡學習新事物。感謝您的建議。 – pavium 2009-08-21 06:10:35

0

在你的函數
首先你需要初始化值單位,比如-6爲U,-3對於m ...等
鴻溝在數量和單位(即微(U)的字符串,米利(M ),等等)。
然後說輸入的no是NUM;和單位是UNIT ..(像你這樣的字符,m等);

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,它只是表明,兩個人永遠不會以同樣的方式解決問題。 – pavium 2009-08-19 13:56:15

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數組添加越來越複雜的正則表達式。

編輯:稍後的比較應該將返回值解釋爲實數。

我希望有人可以建議更優雅的東西。