Исходный код файла sms.php:
<?php
#################################################################################################### |defaults|
# sms.php: сделано 30 декабря с 12:15 до 14:10
error_reporting(E_ALL);
@ini_set('display_errors', 'On');
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_regex_encoding('UTF-8');
mb_detect_order('UTF-8,ASCII');
mb_language('uni');
date_default_timezone_set('Europe/Moscow');
#################################################################################################### |setup|
# Available SMS
$smsAry = [
'Пользователя с таким номером кошелька нет.',
'Неверная сумма.',
'Пароль: 6920
Спишется 0,02р.
Перевод на счет 41001743023728',
'Пароль: 1780
Спишется 10,06р.
Перевод на счет 41001743023728',
'Пароль: 2310
Спишется 100,51р.
Перевод на счет 41001743023728',
'Пароль: 5309
Спишется 301,51р.
Перевод на счет 41001743023728',
'Пароль: 9809
Спишется 1005,03р.
Перевод на счет 41001743023728',
'Никому не говорите пароль! Его спрашивают только мошенники.
Пароль: 32892
Перевод на счет 41001743023728
Вы потратите 5025,13р.',
'Никому не говорите пароль! Его спрашивают только мошенники.
Пароль: 34721
Перевод на счет 41001743023728
Вы потратите 10000р.',
'Недостаточно средств.',
'ПРОВЕРКА СМЕНЫ ПОРЯДКА ПОЛЕЙ:
Перевод для 41001743023728012345 на сумму 987654,78 ₽.
Пароль 123456',
// Added 09 Jan 2017
'Спишется 1000р.
Перевод на счёт 41001743023728012345
Пароль 123456',
'Спишется 1000р.
Перевод на счёт 41001743023728
Пароль 1234',
'Перевод на счёт 41001743023728
Спишется 1000р.
Пароль 1234',
'Спишется 1000р.
Пароль 1234
Перевод на счёт 41001743023728',
];
#################################################################################################### |sms parser|
/*
* Функция должна принимать строку и возвращать код подтверждения, сумму и кошелек
* Порядок полей, пунктуация и слова со временем могут быть изменены!
* @return array [securityCode, paymentSum, walletNumber] if found
* @return -1/-2/-3 if not found
*/
function f_parseYaMoneySMS($sms, $result = [])
{
/*
* securityCode может быть 4- и 5-значным, возможно, подрастёт до 6 знаков
* + невыгодно пересекается по цифровой маске с "Вы потратите 10000р."
*
* Использование модификаторов i (PCRE_CASELESS), s (PCRE_DOTALL), m (PCRE_MULTILINE)
* здесь скорее по привычке - любой шаблон начинаю писать с '#...#ism' для отладки
* http://php.net/manual/en/reference.pcre.pattern.modifiers.php
*
*/
$rgx_securityCode = '#\b\d{4,6}(?![,\d\wр₽])#m';
/*
* paymentSum максимальная сумма 6 знаков (больше Яша не пропустит)
* минимальную сумму эмулятор не ограничивает, даже 0,001 принял :)
*/
$rgx_paymentSum = '#' . '\b' . '(?:\d{1,6}|\d{1,6},\d{2})' . '\s?(?=[р₽]{1})#m';
/*
* walletNumber ориентировочно зададим от 10 и более цифр, проверку на валидность номера
* при необходимости можно будет легко доработать, уточнив диапазоны номеров
*/
$rgx_walletNumber = '#\b\d{10,}\b#m';
# Поиск: возврат ошибки и выход, или сохранение найденного
if (!preg_match($rgx_securityCode, $sms, $matches)) return -1;
$result['securityCode'] = $matches[0];
if (!preg_match($rgx_paymentSum, $sms, $matches)) return -2;
$result['paymentSum'] = $matches[0];
if (!preg_match($rgx_walletNumber, $sms, $matches)) return -3;
$result['walletNumber'] = $matches[0];
return $result;
}
#################################################################################################### |html asm|
# Headers and open body tag
echo <<<ZZZ
<!doctype html>
<html lang="ru">
<head>
<title>SMS parser</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,height=device-height">
<link href="" rel="stylesheet">
<script src=""></script>
<style>
html { font-family:sans-serif; }
div { display:block;margin:0 0 50px 0; }
pre { border:solid #ddd 1px;padding:5px;background:#f4f4f4; }
p { font-size:13px;white-space:pre-wrap; }
</style>
</head>
<body>
<div>
<h1><a href="/vs.php?file=1" title="View source">SMS-парсер</a> для <a href="http://funpay.ru/yandex/emulator" target="_blank">Эмулятора</a></h1>
<p> </p>
</div>
ZZZ;
# Parse all SMS
foreach ($smsAry as $sms)
{
$ary = f_parseYaMoneySMS($sms);
$code = var_export($ary, true);
$_sms = htmlspecialchars($sms, ENT_QUOTES | ENT_HTML5);
$color = $ary > 0 ? 'green':'red';
echo
'<div>'.
'<b>SMS-сообщение:</b>'.
'<pre>'. $_sms .'</pre>'.
'<p style="color:'. $color .'"><b>РЕЗУЛЬТАТ: </b>'. $code .'</p>'.
'</div>';
}
# Close body tag
echo '</body></html>';