2009-05-23 14 views
0

PHPで単純な文字列分割を行うために他にどのようなアプローチが必要なのでしょうか。興味深い値の2つが使用されたコードとユーザーのテキストメッセージであるSMSゲートウェイからの応答を受け取ります。PHPのSMSゲートウェイの分割を分割

コードのようなものであり得る:ユーザメッセージが最良の場合のシナリオは、例えばであるべきであるFreetrip(小文字、大文字、小文字混合)

以下のようになります。Freetrip 12345($ code "space" XXXXX)

各Xは1〜5の数字でなければなりません。他の値/文字はエラーを返します。したがって正規表現は次のように単純化されます:chars = 5ここで各桁> = 1および< = 5。

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

私の最も簡単なアプローチは、メッセージ文字列全体を小文字にし、メッセージ文字列から小文字のコード(スペースも含む)を引きます。それは私が5つのユニークな変数に分割してDBに格納する5桁の数字で私を残すでしょう。

ここで難しいのは、上で説明した最善のケースのシナリオを達成するのが難しいということです。 SMSを入力するのは面倒な作業であり、入力エラーは簡単に発生します。次のようなエラーが発生する可能性があります。

  • 数字が多すぎます。
  • 数字以外の文字。
  • XXXXXの組み合わせ以降の文字数が増えました。
  • おそらく他のいくつかのケース。

送信者に返信できる個別のエラーメッセージを返す必要があります。

答えて

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年前だった)このようなものでした:あなたは "freetrip" をチェックしたりすることはできません

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. 

確かにこの場合は、値が[1-5] {5}あなたの想像力を許す限りあなたのエラーに答えてください:)。がんばろう。

EDIT:最後のものが更新され、あなたのケースに合うはずです。それはあなたがそれを必要とするならば、それが例である別のサービスを作成するのは非常に簡単なので、より良いです。

+0

感謝すべてのショートコード。コードが正確に一致しない限り、SMSゲートウェイからメッセージを受信しないので、2番目のものは必要ありません。 XXXXXの後に送信者によって文字が間違って書き込まれた場合、最初の式が有効になりますか? –

+0

いいえこの場合、このregex: '/^freetrip\s+([1-5]{5}).*/i'を使用することができます。私は最初に大文字小文字を区別しない単語freetripを意味します(^アンカーから文字列開始まで)、1つ以上のスペース文字(\ s +)、1から5までの正確な5文字([1-5 {5}])任意の文字(。*) "。 – Jet

+0

もう一度見ていた。この解決策は、XXXXXの数字以外の文字はまだカバーしません。なぜエンドユーザがそれらを使用しないのですか?前に偽の数字を置き換えるのはとても簡単です。私。 $ sms = str_replace( 'O'、 '0'、$ sms); // O文字をゼロにします。書面ですべてのケースを数字で似て置き換えてください。 IMHOユーザーに馬鹿馬鹿しく伝えるよりもはるかに優れています - 「もう一度書き、注意してください」 – Jet

0

あなたはそのような何かを行うことができます:

最後の1がの世話をするように見えるでしょうがEvgeniyが、私は正規表現で最強はので、私は完全に、式の中で細部のそれぞれを理解していないわけではない
$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 
    } 
} 
+0

単一のケースのためのいい方法。異なるSMSサービスを提供するプラットフォームを設計する場合は、一度 "fubar"を取得します。このソリューションは、サポートと節度の面で大変です。あなたが "管理者"と "設定"と言わなければならないプログラマーとしての "サービス"と言えば、あなたはあなたのソリューションを永遠にサポートします。 – Jet

+0

Gumboの提案に感謝します。小さすぎる/大きすぎる文は、1桁が5より大きい場合にブレークします。この場合は12349です。 –