Сплит SMS-шлюз ответ в PHP - PullRequest
0 голосов
/ 24 мая 2009

Мне интересно, какие другие подходы вы бы использовали для простого расщепления строк в PHP. Я получаю ответ от SMS-шлюза, где два интересных значения - это используемый код и текстовое сообщение пользователя.

Код может быть примерно таким: Freetrip (строчные, прописные, смешанные)

Пользовательское сообщение в лучшем случае должно быть, например, как: Freetrip 12345 ($ код "пробел" XXXXX).

Каждый X должен быть цифрой от 1 до 5. Любое другое значение / символ должно возвращать ошибку. Таким образом, регулярное выражение будет упрощено как: chars = 5, где каждая цифра> = 1 и <= 5. </p>

В конце мне нужно сохранить каждое из 5-значных значений.

Мой самый простой подход состоял бы в том, чтобы сделать строчную строку всей строкой сообщения и вычесть также код в нижнем регистре (плюс пробел) из строки сообщения. Это оставило бы мне 5 цифр, которые я затем разделил бы на 5 уникальных переменных для хранения в БД.

Теперь сложность заключается в том, что наилучший сценарий, описанный выше, может быть труднодостижимым. Ввод SMS является сложным делом, и ошибки при наборе возникают легко. Возможны следующие ошибки:

  • Слишком мало или много цифр.
  • Нецифровые символы.
  • Больше символов после комбинации XXXXX.
  • Возможно, в некоторых других случаях.

Любое из них должно возвращать отдельное сообщение об ошибке, которое я могу вернуть отправителю.

Ответы [ 2 ]

1 голос
/ 24 мая 2009
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} или нет и т. Д., И ответить на вашу ошибку настолько, насколько позволяет ваше воображение :). Удачи.

РЕДАКТИРОВАТЬ: последний обновляется и должен соответствовать вашему случаю. Это лучше, потому что будет очень просто создать другой сервис на его примере, если он вам понадобится.

0 голосов
/ 24 мая 2009

Вы можете сделать что-то подобное:

$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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...