2009-08-19 8 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으로 변환된다.

그러나이 방법은 측정 된 양에 대해 일반화 할 수 있어야합니다. 가 먼저 U에 대한 -6 같은 단위의 값을 초기화 할 필요가
함수에서

답변

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 개 이상의 숫자와 일치합니다 또는 하나 이상의 숫자와 단위 접두사 (단 하나) 및 하나의 알파벳 문자가 차례로옵니다. 숫자와 단위 사이에는 공백이있을 수 있습니다.
  • preg_match의 사용과 사용으로 인해 number 섹션, unit 접두사 및 단위는 모두 $ matches 배열에서 요소 1, 2 및 3으로 별도로 캡처됩니다.(0은 전체 문자열을 포함합니다)
  • $ 결과는 정규 표현식과 일치하면 1, 그렇지 않으면 0이됩니다.
  • $ retval은 번호, 지수 (배열의 단위 접두사를 기반으로 함) 및 제공된 단위를 연결하는 것만으로 구성됩니다. 또는 문자열에 전달됩니다 (예 : -1.003 e-12, 반환 됨)

물론 몇 가지 사항을 조정할 수 있지만 일반적으로 이것은 좋은 시작입니다. 희망이 도움이됩니다.

+0

예, 감사합니다. 연상 배열은 단위 접두사와 지수 사이의 관계를 확실히 분명히하지만, 다음 코드의 복잡성이 증가함에 따라 비용이 발생할 수 있습니다. 실제 구현에는 공백을 제거한 추가 preg_replace가 포함되어있어 1.23uA와 같은 문자열이 1.23e-6이되었다고 생각합니다. 잘 작동하는 것처럼 보였지만 연관 배열의 가독성을 정말 좋아합니다. – pavium

+0

감사합니다. 여기서 유일하게 커지는 복잡성은 정규 표현식 자체입니다. preg_replace는 단지 preg_match보다 비쌉니다. 그럼 다시, 만약 당신이 속도와 성능에 대한거야 왜 PHP를 사용하고 있습니까? = P 당신이 한 번에 많은 수의 이들을 변환하지 않는다면 (내가 의심하는 양식으로부터 입력을받는다면) 복잡성에 대한 비용은 아마도 무시할 수있을 것입니다. – Zeroshade

+0

속도와 성능에 대한 큰 걱정은 없습니다. 피코 앰프와 마이크로 볼트의 차이를 정확히 알지 못하는 운영자가 10 회의 측정을 폼에 입력했는지 확인하고 있습니다. 제가 언급 한 비용은 당신의 정규식 주위에 머리를 가져야 할 때 견뎌야했던 정신 활동이 증가한 것입니다. 그러나 나는 새로운 것을 배우고 싶습니다. 귀하의 제안에 감사드립니다. – pavium

0

, -3 m ... 등
분할 수 및 단위 (예 : 마이크로 (U)에 문자열, 밀리 (m에 대한),기타).
입력 한 다음 아니오를 NUM이라고 말하십시오. 단위는 UNIT .. (u, 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

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'); 

그리고 더 높은 접두사로 확장하지만 중쇄 보인다 수 점점 복잡 해지는 regexes를 $ patterns 배열에 계속 추가합니다.

편집 : 나중에 비교하면 반환 값을 실수로 해석해야합니다.

나는 누군가가 좀 더 우아한 것을 제안 할 수 있기를 바랍니다.