2014-12-18 2 views
3

Я работаю над проблемой, когда пользователи (водители грузовиков в этом случае) используют SMS для отправки информации о статусе работы. Я хочу держать ключ простым, так как не все пользователи имеют смартфоны, поэтому я принял несколько простых коротких кодов для их ввода. Вот некоторые примеры и их значения:Полиморфная строка для шаблона

  • P # 123456-3 (Это для сбора нагрузки 123456-3)
  • D # 456789-1 (для сбрасывания груза 456789- 1)
  • L # 345678-9 (Load 345678-9 будет поздно)

Это довольно простой, но пользователи (и водителей грузовиков) является то, что они будут ключ обновления в несколько девиантные манеры, такие как:

  • #D 456789-1
  • D # 456789 - 1
  • D # .456789-1 Эта нагрузка выглядит мокрая мне сделать, чтобы cancelthis Каждому из нас Заказать

Вы можете в значительной степени придумать дюжину других перестановок, и мне не трудно поймать и исправить то, что я могу себе представить.

В основном я использую регулярные выражения для проверки ввода ко всем моим воображаемым «плохим» образцам, а затем извлекаю то, что, как я предполагаю, является хорошими частями, переустанавливая их в правильном порядке.

Это новые ошибки, которые вызывают у меня проблемы, поэтому мне стало интересно, был ли более общий метод, когда я могу передать «шаблон» и «сообщение» функции, которая лучше всего повернуть «сообщение» «во что-то совпадающее с« шаблоном ».

Мои поиски не нашли ничего, что действительно соответствует тому, что я пытаюсь сделать, и я даже не уверен, есть ли хороший общий способ сделать это. Я использую 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

Если у пользователя возникли проблемы с вашим программным обеспечением, исправьте программное обеспечение, а не пользователь!

Проблема возникает из-за того, что ваш формат выглядит излишне сложным. Зачем вам нужен хэш в первую очередь? Как насчет упрощения его вниз к следующему:

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

кода Операция назначена разным ключам телефона, так что J, K и L означают то же самое. Номера загрузки могут быть отправлены как цифры и как буквы, например, agja средства 2452. В этом формате пользователю трудно ошибиться.

Вот код, чтобы проиллюстрировать этот подход:

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)/ 

или быть еще более расслабленным,

/^[^\d]*([PDL])[^\d]*(\d+)[^\d]+(\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! 
} 
Смежные вопросы