我正在研究一个问题,用户(本例中是卡车司机)使用短信发送有关工作状态的信息。我想保持按键的简单,因为不是所有的用户都有智能手机,所以我采用了一些简单的短代码作为输入。以下是一些例子及其含义:
P 123456-3(用于装载123456-3)
d 456789-1(用于载荷456789-1的下降)
L 345678-9(负载345678-9将延迟)
这很简单,但用户(和卡车司机)就是他们,他们会以一些不正常的方式进行更新,例如:
D 467 89-1
D 456789-1号
D.456789-1我看这批货湿了,我们必须取消订单
你几乎可以想出十几个其他排列,我不难捕捉和修复那些我可以想象的。
我通常使用正则表达式来测试所有我想象中的“坏”模式的输入,然后提取我认为是好的部分,将它们重新组合成正确的顺序。
这是造成我问题的新错误,所以我想知道是否有一种更通用的方法,我可以把一个“模式”和一个“消息”传递给一个函数,它将把“消息”变成与“模式”相匹配的东西。
我的搜索没有找到任何真正符合我正在尝试做的事情,我甚至不确定是否有一个好的通用方法来做这件事。我碰巧在这个实现中使用了php,但是任何类型的例子都应该有用。你们有办法吗?

最佳答案

试试这样的:

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
)

10-05 22:35