-1

我想知道您会采取哪些其他方法在 PHP 中进行一些简单的字符串拆分。我收到来自 SMS 网关的响应,其中两个有趣的值是使用的代码和用户的文本消息。

代码可能类似于:(Freetrip小写、大写、混合大小写)

在最好的情况下,用户消息应该是例如:Freetrip 12345($code "space" XXXXX)。

每个 X 应该是 1 到 5 之间的数字。任何其他值/字符都应该返回错误。所以正则表达式将被简化为:chars=5 其中每个数字 >=1 和 <=5。

我最后需要存储的是 5 位数字中的每一个。

我最简单的方法是将整个消息字符串小写并从消息字符串中减去同样小写的代码(加上空格)。这将给我留下 5 个数字,然后我将其拆分为 5 个唯一变量以存储在数据库中。

现在棘手的部分是上述最佳情况可能难以实现。打字短信很繁琐,而且很容易出现打字错误。可能出现的一些错误如下:

  • 数字太少或太多。
  • 非数字字符。
  • XXXXX 组合后的更多字符。
  • 可能还有一些其他情况。

其中任何一个都应该返回一个单独的错误消息,我可以将其返回给发件人。

4

2 回答 2

1
if (!preg_match('/^freetrip\s+([1-5]{5})$/i', $sms, $matches)) exit("error");
print_r($matches);

我对 SMS 平台和 AFAIK 有一些经验,一个错误就足够了。我们试图检测类似的字符,如小 L 和大 I 等,或零和 O 字母。例如,在您的情况下,您可以编写如下内容:

preg_match('/^freetr[il1|]p\s+([1-5]{5})$/i', $sms, $matches);

您可以在消息模式的任何地方执行相同的操作(如果您愿意)。

我做了这样的事情(不确定 - 那是 5 年前):

if (!preg_match('/^(\w+)\s+(.*)/i', $sms, $matches)) exit('bad message format');
$value = $matches[2];

// some letters look like digits
$value = str_replace(array('o', 'O'), 0);
$value = str_replace(array('i', 'I', 'l'), 1);
if (!preg_match('/^[12345]{5}/')) exit("invalid code");
// do something here... message is OK.

当然,在这种情况下,您可以检查“freetrip”与否,值是否为 [1-5]{5} 等,并尽可能多地响应您的错误 :)。祝你好运。

编辑:最后一个已更新,应该适合您的情况。更好,因为如果您需要它,在它的示例上创建另一个服务将非常简单。

于 2009-05-23T21:22:15.997 回答
0

你可以这样做:

$code = 'Freetrip';
if (strlen($input) <= strlen($code)) {
    // too short
} elseif (!preg_match('/^'.preg_quote($code, '/').'(.*)/i', $input, $match)) {
    // wrong code
} else {
    $x = (int)trim($match[0]);
    if ($x < 11111) {
        // too small
    } elseif ($x > 55555) {
        // too large
    } else {
        // valid
    }
}
于 2009-05-23T21:31:33.060 回答