【问题标题】:Validate measurements with PHP使用 PHP 验证测量值
【发布时间】:2010-11-20 23:00:20
【问题描述】:

我需要验证输入到 PHP 生成的表单中的测量值。

我打算将它们与控制上限和下限进行比较,并决定它们是失败还是通过。

作为第一步,我想象一个 PHP 函数,它接受代表工程测量的字符串并在比较之前将它们转换为纯数字。

目前我只期望测量小电压和电流,所以像

这样的字符串

“1.234uA”、“2.34 nA”、“39.9mV”。或'-1.003e-12'

将转换为

分别为 1.234e-6、2.34e-9、3.99e-2 和 -1.003e-12。

但是该方法应该可以推广到任何测量的量。

【问题讨论】:

    标签: php validation units-of-measurement


    【解决方案1】:

    在你的函数中
    首先,您需要初始化单位的值,例如 -6 为 u,-3 为 m...等
    以数字和单位划分字符串(即 micro(u)、mili(m) 等)。
    然后说输入的 no 是 NUM;单位是 UNIT..(char like u,m etc);

    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;
    

    也许它会做!

    【讨论】:

    • 谢谢,Pradyumna,这只是表明两个人永远不会以同样的方式解决问题。
    【解决方案2】:

    我自己可能头脑简单的方法是在 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 数组添加越来越复杂的正则表达式似乎很笨拙。

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

    我希望有人能提出更优雅的建议。

    【讨论】:

      【解决方案3】:
      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;
      }
      

      所以解释一下上面的作用:

      • $units 是一个数组,用于将单位前缀映射到指数。
      • $unitstring 将单位合并为一个字符串(在示例中为“pnum”)
      • 正则表达式将匹配可选的 -,后跟 0 个或多个数字、句点和 1 个或多个数字或 1 个或多个数字,后跟一个单位前缀(只有一个),然后是单个字母字符.数字和单位之间可以有任意数量的空格。
      • 由于括号和 preg_match 的使用,数字部分、单位前缀和单位都被单独捕获在数组 $matches 中作为元素 1、2 和 3。(0 将包含整个字符串)
      • 如果匹配正则表达式,$result 将为 1,否则为 0。
      • $retval 仅通过连接数字、指数(基于数组中的单位前缀)和提供的单位来构造,或者它只是传入的字符串(例如,如果给定 -1.003 e-12,它将被退回)

      当然你可以调整一些东西,但总的来说这是一个好的开始。希望对您有所帮助。

      【讨论】:

      • 是的,谢谢 Zeroshade。关联数组当然清楚地说明了单位前缀和指数之间的关系,但可能会因以下代码的复杂性增加而付出代价。我认为我的实际实现包括一个额外的 preg_replace 删除空格,以便像 1.23 uA 这样的字符串变成 1.23e-6 它似乎工作得很好,但我真的很喜欢你的关联数组的可读性。
      • 谢谢。这里唯一增加的复杂性是正则表达式本身。 preg_replace 将比 preg_match 更昂贵。再说一次,如果您追求速度和性能,为什么要使用 php? =P 除非您一次转换大量这些(如果您从表单中获得输入,我怀疑),否则复杂性的成本可能可以忽略不计。
      • 不用担心速度和性能:我只是验证操作员在表格中输入的 10 个测量值,操作员不一定知道皮安和微伏之间的区别。我提到的成本是当我了解你的正则表达式时我不得不忍受的增加的心理活动。但我喜欢学习新事物。感谢您的建议。
      猜你喜欢
      • 2019-07-25
      • 2012-02-26
      • 1970-01-01
      • 2016-07-06
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2014-06-05
      相关资源
      最近更新 更多