<?php
declare(strict_types=1);
static $text1 = '
Пароль: 0936
Спишется 1241р.
Перевод на счет 410012124208089
';
static $text2 = '
Пароль: 3042
Спишется 1240,21р.
Перевод на счет 410012124208089
';
static $text3 = '
Пароль: 3042
Спишется 1240,21 руб
Перевод на счет 410012124208089
';
function parse(string $text): array
{
$count = preg_match_all(/** @lang RegExp */
'/
(?:
# самое простое — кошелёк получателя. Считаем, что он 15 символов
(?<address>\d{15})
# дальше самое сложное — сумма перевода. Может быть целым или с разделителем копеек, в этом и сложность
# так как может быть целым, то нам нужно её отличить от кода подтверждения
|(?:
(?<sum>
\d+
(?:[,.]{1}\d+|)
)
# будем считать, что после суммы будет написана валюта. Иначе не угадать что — код, а что — сумма.
# допустим, что может быть слитно или через пробелы
# допустим, что по-английски или по-русски, с маленькой или с большой буквы
(?i:\s*[рr])
)
# дальше опять просто — код подтверждения. Просто целое число
|(?<code>\d+)
)
/x', $text, $matches, PREG_PATTERN_ORDER);
var_dump($matches);
die;
if ($count !== 3) {
throw new RuntimeException('Всё пропало, нужно писать новую регулярку');
}
$sum = 0;
$code = 0;
$address = 0;
for ($i = 0; $i < 3; $i++) {
[$tempSum, $tempCode, $tempAddress] = [$matches['sum'][$i], $matches['code'][$i], $matches['address'][$i]];
if ($tempSum) {
$sum = $tempSum;
}
if ($tempCode) {
$code = $tempCode;
}
if ($tempAddress) {
$address = $tempAddress;
}
}
return compact('code', 'sum', 'address');
}
echo $text1 . PHP_EOL;
$result = parse($text1);
var_dump($result);
echo $text2 . PHP_EOL;
$result = parse($text2);
var_dump($result);
echo $text3 . PHP_EOL;
$result = parse($text3);
var_dump($result);