Извлечь номер, который находится на 2-й / 3-й строке из матча

0

Я, к сожалению, потерял некоторые важные финансовые данные из своей базы данных из-за технических проблем, и поэтому мне необходимо пройти через свои счета-фактуры, которые доступны в Интернете.

Есть, вероятно, тысячи транзакций, поэтому я подумал, что самое умное дело - создать программу, которая сможет извлекать нужные мне транзакции.

Как только 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
);

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

Я потерян, любая помощь будет оценена.

  • 0
    Каждая строка с ammount начинается с «on»?
  • 0
    @dminones Извините, каждая строка начинается со строки «Дебет»
Показать ещё 6 комментариев
Теги:

2 ответа

1
Лучший ответ

Ниже приведен лучший вариант, предполагающий, что site.com (без site.com регистра) является единственным ключом, который вам нужно сопоставить до получения значения.

Regex

(?:site(?:\.com)?[\s\w^]*)\s(\d+\.\d{2})

REGEX101

пример

$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);

Редактировать Мне действительно нужно больше кофе, тем не менее я обновляю выше (надеюсь, в последний раз)...

  • 0
    У меня длинный вопрос, поэтому я могу понять, почему вы что-то неправильно поняли, мне нужны транзакции только с сайта или site.com или site.Com, это возвращает все суммы транзакций, включая нежелательную транзакцию PayPal
  • 1
    К сожалению, обновление сейчас.
Показать ещё 4 комментария
0

Вот ответ, бинго.

    $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 - это тот массив, в котором вы нуждаетесь.

  • 0
    Не работает полностью, так как нужно проверить числовое значение (\ d +), за которым следует a . а затем ровно два числовых значения (\ d {2}), см. REGEX101
  • 0
    Извините, пробовал несколько раз, не получилось
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню