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

代码可能是这样的: Freetrip (小写、大写、混合大小写)

在最好的情况下,用户消息应该是例如喜欢: Freetrip 12345 ($代码“空格”XXXXX)。

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

我最后需要存储的是每 5 位数字的值。

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

现在棘手的部分是上述最好的情况可能很难实现。输入短信非常繁琐,而且很容易出现输入错误。可能发生的一些错误如下:

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

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

有帮助吗?

解决方案

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

我对短信平台有一些经验,据我所知,一个错误就足够了。我们尝试检测类似的字符,例如小 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}等,并尽可能地响应您的错误:)。祝你好运。

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

其他提示

你可以这样做:

$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
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top