我正在研究一个问题,用户(本例中是卡车司机)使用短信发送有关工作状态的信息。我想保持按键的简单,因为不是所有的用户都有智能手机,所以我采用了一些简单的短代码作为输入。以下是一些例子及其含义:
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
)