Я, к сожалению, потерял некоторые важные финансовые данные из своей базы данных из-за технических проблем, и поэтому мне необходимо пройти через свои счета-фактуры, которые доступны в Интернете.
Есть, вероятно, тысячи транзакций, поэтому я подумал, что самое умное дело - создать программу, которая сможет извлекать нужные мне транзакции.
Как только pdf файлы преобразуются в простой текст, структура, похоже, сломается, и у меня есть что-то похожее на этот беспорядок
Debit card payment to site.com
Germany
on 01 May 3.63
Debit card payment to site Germany
on 01 May 3.63
Debit card payment to site.Com
Germany
on 01 May 3.63
Debit card payment to Paypal *Xiao
Ref:- 23948 0000000000 32.98
Из вышеперечисленных транзакций я хотел бы получить платежи, 3.63, 3.63, 3.63 и поместить их в массив.
Каждая транзакция начинается со слова Debit и заканчивается суммой.
Я пытаюсь выяснить свои расходы, и, поскольку я покупаю только один поставщик (позвонил на сайт поставщика), мне нужно только извлечь сумму платежа, которую я сделал для этой организации
Значение платежа находится в конце каждой транзакции, я думаю, что мой лучший вариант - использовать php и regex (примечание: "сайт" имеет 3 разных сайта вариантов имен, site.com, site.Com)
Я, честно говоря, мало знаю о регулярном выражении, но ниже моя попытка, которая не зашла далеко
preg_match(
"/(Debit card payment to site.com).*?(([1-9][0-9]*|0)(\.[0-9]{2})?)/",
$text,
$results
);
Вышеупомянутое регулярное выражение не работает с разрывами строк и, вероятно, не извлекает первое вхождение после поискового запроса.
Я потерян, любая помощь будет оценена.
Ниже приведен лучший вариант, предполагающий, что site.com
(без site.com
регистра) является единственным ключом, который вам нужно сопоставить до получения значения.
Regex
(?:site(?:\.com)?[\s\w^]*)\s(\d+\.\d{2})
пример
$re = "/(?:site(?:\\.com)?[\\s\\w^]*)\\s(\\d+\\.\\d{2})/i";
$str = "Debit card payment to site.com\nGermany\non 01 May 3.63\nDebit card payment to site Germany\non 01 May 3.63\nDebit card payment to site.Com\nGermany\non 01 May 3123.63\nDebit card payment to Paypal *Xiao\nRef:- 23948 0000000000 32.98";
preg_match_all($re, $str, $matches);
Редактировать Мне действительно нужно больше кофе, тем не менее я обновляю выше (надеюсь, в последний раз)...
Вот ответ, бинго.
$regex = "/\s([0-9]\.[0-9][0-9]+)/";
$text = "Debit card payment to site.com
Germany
on 01 May 3.63
Debit card payment to site Germany
on 01 May 3.63
Debit card payment to site.Com
Germany
on 01 May 3.63
Debit card payment to Paypal *Xiao
Ref:- 23948 0000000000 32.98";
preg_match_all($regex, $text, $matches);
$result = $matches[1];
Я тестировал его, он отлично работает, и он должен работать на вас.
$result
- это тот массив, в котором вы нуждаетесь.
.
а затем ровно два числовых значения (\ d {2}), см. REGEX101