-1

PHP で単純な文字列分割を行うために、他にどのようなアプローチを採用するのだろうかと考えています。SMS ゲートウェイから応答を受信して​​います。2 つの興味深い値は、使用されたコードとユーザーのテキスト メッセージです。

コードは次のようになります: Freetrip(小文字、大文字、大/小文字混合)

最良のシナリオでは、ユーザー メッセージは次のようになります: Freetrip 12345($code "space" XXXXX)。

各 X は 1 から 5 までの数字である必要があります。その他の値/文字はエラーを返します。したがって、正規表現は次のように単純化されます。

最後に保存する必要があるのは、5 桁の値のそれぞれです。

私の最も簡単なアプローチは、メッセージ文字列全体を小文字にし、同じく小文字のコード (およびスペース) をメッセージ文字列から差し引くことです。これで 5 桁が残り、それを 5 つの一意の変数に分割して DB に格納します。

ここで注意が必要なのは、上記の最良のシナリオを実現するのは難しいかもしれないということです。SMS の入力は面倒で、入力エラーが発生しやすいです。発生する可能性のあるエラーは次のとおりです。

  • 桁数が少なすぎるか多すぎます。
  • 数字以外の文字。
  • XXXXX の組み合わせの後に追加の文字。
  • おそらく他のいくつかのケース。

それらのいずれも、送信者に返すことができる個別のエラー メッセージを返す必要があります。

4

2 に答える 2

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

SMSプラットフォームの経験があり、AFAIK 1つのエラーで十分です。小文字の 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} かどうかなどを確認して、想像できる限りエラーに応答してください :)。幸運を。

EDIT:最後のものが更新され、あなたのケースに合うはずです。必要に応じて、例に基づいて別のサービスを作成するのが非常に簡単になるため、より良い方法です。

于 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 に答える