PHP split SMS ağ geçidi cevap

2 Cevap php

Ben PHP bazı basit dize bölme yapmak için alacağını ne diğer yaklaşımlar merak ediyorum. Ben ilginç değerlerin iki kullanılan kodu ve kullanıcıların metin mesajı olan bir SMS ağ geçidi bir yanıt alıyorum.

Freetrip (küçük harf, büyük harf, küçük harf karışık): kod gibi bir şey olabilir

Kullanıcı mesajı iyi senaryoya örneğin olmalıdır gibi: Freetrip 12345 ($ code "boşluk" XXXXX).

Her X 1 ve 5 arasında bir rakam olmalıdır. Başka bir değer / karakteri bir hata döndürür. Karakter = 5 burada her rakam> = 1 ve <= 5: Yani regex olarak basitleştirilmiş olacaktır.

Ne sonunda saklamak gerekir 5 basamak değerlerinin her olacaktır.

Benim basit yaklaşım tüm mesaj dize küçük harf ve ileti dizeden de küçük harfli kod (artı boşluk) çıkarmak olacaktır. Ben daha sonra DB depolamak için 5 benzersiz değişkenlere bölünmüş olacaktır 5 basamak beni bırakacaktı.

Şimdi zor kısmı yukarıda açıklanan en iyi senaryo elde etmek zor olabilir olmasıdır. Bir SMS yazarak keman ve yazım hatalarını kolayca oluşabilir. Oluşabilecek bazı hatalar aşağıdaki gibidir:

  • Çok az ya da çok basamaklı.
  • Sigara basamaklı karakterler.
  • XXXXX organizasyondan sonra daha fazla karakter.
  • Muhtemelen diğer bazı durumlarda.

Bu herhangi bir gönderene dönebilirsiniz bireysel hata mesajı döndürür.

2 Cevap

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

SMS-platformları ile bazı deneyimi vardı ve AFAIK bir hata yeterlidir. Biz küçük L ve büyük I vb veya sıfır ve O-harfi gibi benzer karakterleri tespit etmeye çalıştı. Örneğin sizin durumunuzda böyle bir şey yazabilirsiniz:

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

(isterseniz) aynı size mesaj desen herhangi bir yerde yapabilirsiniz.

Ben böyle bir şey yaptım (emin değilim - 5 yıl önce idi):

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.

Bu durumda "freetrip" veya kontrol edebilirsiniz Tabii, değer [1-5] {5} ya da değil gibi, ve tepki hata kadar hayal verir gibi :) olduğunu. İyi şanslar.

EDIT: son bir güncellenir ve sizin durumunuzda uygun olmalıdır. Onu bunu gerekir eğer örneğinde başka bir hizmet oluşturmak için çok basit olacaktır, çünkü daha iyi.

Böyle bir şey yapabilirsiniz:

$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
    }
}