2014-12-18 3 views
3

사용자 (트럭 운전자)가 SMS를 사용하여 작업 상태에 대한 정보를 보내는 문제에 대해 작업하고 있습니다. 모든 사용자가 스마트 폰을 갖고있는 것은 아니므로 키 입력을 간단하게하고 싶습니다. 그래서 입력에 대한 간단한 간단한 코드를 채택했습니다. 몇 가지 실시 예 및 그들의 의미는 이하와 같다 :무늬 다형 문자 문자열

  • P 번호 (이 부하 123456-3 따기위한) 123456-3
  • D 번호 456789-1 (부하 456789-의 적하 1)
  • (로드 345678-9는

이 꽤 간단하지만 사용자 (및 트럭 드라이버)가 어느 정도의 업데이트를 키 입력 할 무엇 인) 늦게 될 것입니다 345678-9 L 번호 같은 비정상적인 방식 :

  • #D 456789-1
  • D 번호 456789-1
  • D 번호는 0.456789-1이로드 순서를
  • 을 cancelthis하는 weneed을 나에게 젖은 보인다

당신은 꽤 많은 다른 순열을 생각해 낼 수 있습니다. 그리고 제가 상상할 수있는 것들을 잡아서 고치는 것은 어렵지 않습니다.

나는 대부분 내 상상 된 "나쁜"패턴에 대한 입력을 테스트 한 다음 좋은 부분이라고 가정 한 내용을 추출하여 올바른 순서로 다시 어셈블합니다.

새로운 오류로 인해 문제가 발생하므로 "패턴"과 "메시지"를 전달할 수있는보다 일반적인 방법이 있는지 궁금해졌습니다. "메시지"를 돌려주는 것이 가장 좋습니다 "을"패턴 "과 일치하는 것으로 변환합니다.

내 검색에서 수행하려는 작업에 실제로 맞는 내용을 찾지 못했지만이 작업을 수행 할 수있는 일반적인 방법이 있는지 확실하지 않습니다. 이 구현을 위해 PHP를 사용하고 있지만 모든 유형의 예제가 도움이 될 것입니다. 여러분 중 누구라도 방법이 있습니까?

+3

왜 다시 SMS를 전송하지 않는 드라이버에 의해 전송 된 코드에 따라되지 않도록 지정된 형식? – HamZa

+0

나는 모든 접근법을 포착 할 수 있을지 확실하지 않습니다. 답안에 제시된 내용을 보는 것은 흥미로울 것입니다. 불행히도 원시 사용자 입력에 의존하는 대신 모바일 앱이 가장 안전한 방법이라고 생각합니다. 사용자가 작업 번호 다음에 상태를 선택할 수있게하면 텍스트를 계속 실행할 수 있습니다. 또는 Regex와 이전 주석을 결합하여 실수 유형을 잡으려고 시도합니다. 모두 실패하면 응답이 취소됩니다. – Lex

+0

"오류"코드 만 입력하십시오. 공백, 점, 주석 없음 THX " –

답변

3

이 같은 것을보십시오 :

function parse($input) { 
    // Clean up your input: 'D#.456789 - 1 foo bar' to 'D 456789 1 foo far' 
    $clean = trim(preg_replace('/\W+/', ' ', $input)); 
    // Take first 3 words. 
    list($status, $loadId1, $loadId2) = explode(' ', $clean); 
    // Glue back your load ID to '456789-1' 
    $loadId = $loadId1 . '-' . $loadId2; 
    return compact('status', 'loadId'); 
} 

예 :

$inputs = array(
    'P#123456-3', 
    '#D 456789-1', 
    'D# 456789 - 1', 
    'D#.456789-1 This load looks wet to me do weneed to cancelthis order', 
); 
echo '<pre>'; 
foreach ($inputs as $s) { 
    print_r(parse($s)); 
} 

출력 :

Array 
(
    [status] => P 
    [loadId] => 123456-3 
) 
Array 
(
    [status] => D 
    [loadId] => 456789-1 
) 
Array 
(
    [status] => D 
    [loadId] => 456789-1 
) 
Array 
(
    [status] => D 
    [loadId] => 456789-1 
) 
+0

이것은 나를 위해 훌륭한 답이되고 말았습니다. 내가 해 본 다른 것들을 덮기 위해 preg_replace 패턴을 조금 조정할 것이다. – BigMikeL

4

사용자가 소프트웨어에 문제가있는 경우 사용자가 아니라 소프트웨어를 수정하십시오!

형식이 복잡해 보이기 때문에 문제가 발생합니다. 왜 첫 번째 장소에서 해시가 필요한가요? 어떻게 다음에 그것을 아래로 단순화에 대한 : J, KL이 같은 뜻 있도록

operation-code maybe-space load-number maybe-space and comment 

작동 코드가, 다른 전화 키에 할당됩니다. 로드 번호는 숫자 및 문자로 보낼 수 있습니다 (예 : agja2452을 의미합니다. 사용자가이 형식을 사용하여 실수를하는 것은 어렵습니다.당신이 원하는 걸 얻을 것이다,

/^[^\d]*([PDL])[^\d]*(\d+)[^\d]+(\d)/ 

function parse($msg) { 

    $codes = array(
     3 => 'DROP', 
     5 => 'LOAD', 
     // etc 
    ); 

    preg_match('~(\S)\s*(\S+)(\s+.+)?~', $msg, $m); 
    if(!$m) 
     return null; // cannot parse 

    $a = '.,"?!abcdefghijklmnopqrstuvwxyz'; 
    $d = '1111122233344455566677777888999'; 

    return array(
     'opcode' => $codes[strtr($m[1], $a, $d)], 
     'load' => intval(strtr($m[2], $a, $d)), 
     'comment' => isset($m[3]) ? trim($m[3]) : '' 
    ); 
} 

print_r(parse(' j ww03 This load looks wet to me')); 
//[opcode] => LOAD 
//[load] => 9903 
//[comment] => This load looks wet to me 

print_r(parse('dxx0123')); 
//[opcode] => DROP 
//[load] => 99
//[comment] => 
+0

그런 식으로 전화 키를 사용하는 것은 정말 영리한 생각입니다. – moopet

+0

사용자가 문제가있는 경우 ... 사용자를 교육하십시오. –

+1

@ElzoValugi : 태도의 문제입니다. 나는 개인적으로 그것을 가지고 그래서 나의 사용자가 가지고 있을지도 모른다 문제는 그들의 문제가 아닌 _my_ 문제이다. – georg

2

뭔가

/^[#\s]*([PDL])[#\s]*(\d+[\s-]+\d)/ 

같은 또는 더 편안 할 수 :

다음은이 방법을 설명하기 위해 몇 가지 코드입니다. 하지만 솔루션으로 함자의 의견을 원합니다 : 다시 던져 :) 함께

3

먼저 자신의 행위를 얻기 위해 그들에게,이 안 물건을 제거 :

$str = preg_replace('/[^PDL\d-]/i', '', $str); 

당신에게 제공 다음 정규화 결과 :

D456789-1 
D456789-1 
D456789-1ldlddld 

그런 다음 데이터와 일치하는 시도는 당신이 원하는 :

if (preg_match('/^([PDL])(\d+-\d)/i', $str, $match)) { 
    $code = $match[1]; 
    $load = $match[2]; 
} else { 
    // uh oh, something wrong with the format! 
}