· 5 years ago · Dec 17, 2019, 09:16 AM
1<?php
2
3class YMSmsParseStatus {
4 public const S_OK = 0;
5 public const S_FAIL = 1;
6}
7
8class YMSmsParseResult {
9 /**
10 * @var int
11 */
12 public $resultCode;
13
14 /**
15 * @var string
16 */
17 public $originalText;
18
19 /**
20 * @var string
21 */
22 public $cashNumber;
23
24 /**
25 * @var float
26 */
27 public $amount;
28
29 /**
30 * @var string
31 */
32 public $secretKey;
33
34 /**
35 * @var string
36 */
37 public $unknownDigits;
38
39 public function __construct(string $text)
40 {
41 $this->resultCode = YMSmsParseStatus::S_FAIL;
42 $this->originalText = $text;
43 }
44
45 public function isOk(): bool
46 {
47 return $this->resultCode === YMSmsParseStatus::S_OK;
48 }
49}
50
51class YMSmsParser
52{
53 public const RE_CACH_NUMBER = '/(\d{16})/u';
54 public const RE_AMOUNT = '/([0-9 ,\.]+)р/ui';
55 public const RE_SECRET_KEY = '/(\d{4})/u';
56 public const RE_UNKNOWN_DIGITS = '/(\d+)/u';
57
58 public function parse(string $text): YMSmsParseResult
59 {
60 $result = new YMSmsParseResult($text);
61
62 $result->cashNumber = $this->extract($text, self::RE_CACH_NUMBER);
63 if ($result->cashNumber === null) {
64 return $result;
65 }
66
67 $amount = $this->extract($text, self::RE_AMOUNT);
68 if ($amount === null) {
69 return $result;
70 }
71 $result->amount = floatval(str_replace([' ', ','], ['', '.'], $amount));
72
73 $result->secretKey = $this->extract($text, self::RE_SECRET_KEY);
74 if ($result->secretKey === null) {
75 return $result;
76 }
77
78 $result->unknownDigits = $this->extract($text, self::RE_UNKNOWN_DIGITS);
79 if ($result->unknownDigits === null) {
80 $result->resultCode = YMSmsParseStatus::S_OK;
81 }
82
83 return $result;
84 }
85
86 protected function extract(string &$text, string $pattern): ?string
87 {
88 if (preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE)) {
89 $text = substr_replace($text, '', $matches[0][1], strlen($matches[0][0]));
90
91 return $matches[1][0];
92 }
93
94 return null;
95 }
96}
97
98$sms = '
99 Пароль: 1234
100 Сумма: 1 100,01 р.
101 Кошелек: 4100001234567890
102';
103
104$parser = new YMSmsParser();
105$result = $parser->parse($sms);
106if ($result->isOk()) {
107 echo 'OK', PHP_EOL;
108} else {
109 echo 'FAIL', PHP_EOL;
110}
111var_dump($result);