2009-08-19 29 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数组添加越来越复杂的正则表达式。

编辑:稍后的比较应该将返回值解释为实数。

我希望有人可以建议更优雅的东西。