Найти сумму в квитанции, полученной OCR - PHP - PullRequest
0 голосов
/ 08 июня 2018

У меня проблемы с поиском суммы, уплаченной пользователем в строке квитанции, полученной с помощью API vision.

Например:

$testo2 = "Del burger Sr Via Carlo del Prete 106/d 50127 FIRENZE C.F. E P.IVA 08380120482 BRUNCH MAMMAMIA ONION RINGS SPICCHI PATATE ACQUA 0.5L TAVOLO 88 EURO 6,50 6,50 4,00 3,00 1,00 TOTALE EURO CONTANTI 21,00 21,00 NR.0057 23/05/18 20:21 MF U1 72005985";

Чтобы найти сумму, которую я пыталсядля поиска в пределах точки или запятой (в некоторых квитанциях есть точка и другая запятая), затем проверьте, есть ли два числа после точки или запятой, а затем какое-то время ищите номера перед запятой, пока не найдет найденный символэто число.Затем я помещаю значения в массив и инвертирую его таким образом, чтобы составить полную строку цены (включая значения после запятой).Затем цены вводятся в массив.

 for($i = 1; $i <= $lenghtTesto2 - 1; $i++)
{
   if($testo2[$i] == "." || $testo2[$i] == ",")
   {
      if($testo2[$i + 1] == "0" || $testo2[$i + 1] == "1" || $testo2[$i + 1] == "2" || $testo2[$i + 1] == "3" || $testo2[$i + 1] == "4" || $testo2[$i + 1] == "5" || $testo2[$i + 1] == "6" || $testo2[$i + 1] == "7" || $testo2[$i + 1] == "8" || $testo2[$i + 1] == "9")
      {
         if($testo2[$i + 2] == "0" || $testo2[$i + 2] == "1" || $testo2[$i + 2] == "2" || $testo2[$i + 2] == "3" || $testo2[$i + 2] == "4" || $testo2[$i + 2] == "5" || $testo2[$i + 2] == "6" || $testo2[$i + 2] == "7" || $testo2[$i + 2] == "8" || $testo2[$i + 2] == "9")
         { 

          $check = true;
          while($check)
          {
              if($testo2[$i - $j] == "0" || $testo2[$i - $j] == "1" || $testo2[$i - $j] == "2" || $testo2[$i - $j] == "3" || $testo2[$i - $j] == "4" || $testo2[$i - $j] == "5" || $testo2[$i - $j] == "6" || $testo2[$i - $j] == "7" || $testo2[$i - $j] == "8" || $testo2[$i - $j] == "9")
              {          


                array_push($arrPrezzi_invertiti, $testo2[$i - $j]);

                $j++;

              }
              else
              {
                 $prezzo = "";
                 $totaleFinale = "";
                 $dopoPunto1 = $testo2[$i + 1];
                 $dopoPunto2 = $testo2[$i + 2];
                 $j = 1;
                 $lenght_arrPrezzi_invertiti = count($arrPrezzi_invertiti);


                 for($k = $lenght_arrPrezzi_invertiti - 1; $k >= 0; $k--)
                 {
                     $totaleFinale .= $arrPrezzi_invertiti[$k];

                 }

                 $prezzo = $totaleFinale . "." . $dopoPunto1 . $dopoPunto2;

                 array_push($array, $prezzo);

                 $check = false;
              }   
          }              
     }
  }
}
}

Деньги составляют 6,50 6,50 4,00 3,00 1,00 21,00 21,00

First example of receipt

Second example of receipt

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Чтобы найти сумму, вы можете использовать preg_match .

TOTALE EURO CONTANTI\s*\K\d+[.,]\d+

Или с одним или несколькими пробельными символами между TOTALE EURO CONTANTI:

TOTALE\s+EURO\s+CONTANTI\s+\K\d+[.,]\d+

Вы можете сопоставить TOTALE EURO CONTANTI, за которым следует ноль или более пробельных символов, \s* и затем сбросить начальную точку совпадения.Затем сопоставьте одну или несколько цифр, запятую или точку, используя класс символов, за которым следуют одна или несколько цифр \d+[.,]\d+

$re = '/TOTALE EURO CONTANTI\s*\K\d+,\d+/';
$str = 'Del burger Sr Via Carlo del Prete 106/d 50127 FIRENZE C.F. E P.IVA 08380120482 BRUNCH MAMMAMIA ONION RINGS SPICCHI PATATE ACQUA 0.5L TAVOLO 88 EURO 6,50 6,50 4,00 3,00 1,00 TOTALE EURO CONTANTI 21,00 21,00 NR.0057 23/05/18 20:21 MF U1 72005985';

preg_match($re, $str, $matches);
echo $matches[0]; // 21,00

Демо

0 голосов
/ 08 июня 2018

Используйте preg_match ();

Вам нужно будет добавить возможные комбинации слов в [\sEURO|\sCONTANTI|\sECT.]

В любом случае это даст вам представление.Возьмите его, пока не получите, как хотите.

$testo2 = "Del burger Sr Via Carlo del Prete 106/d 50127 FIRENZE C.F. E P.IVA 08380120482 BRUNCH MAMMAMIA ONION RINGS SPICCHI PATATE ACQUA 0.5L TAVOLO 88 EURO 6,50 6,50 4,00 3,00 1,00 TOTALE EURO CONTANTI 21,00 21,00 NR.0057 23/05/18 20:21 MF U1 72005985";
$testo2 = preg_replace('/\s{1,}/', ' ', $testo2);
preg_match('/[\s\S]{0,}TOTALE\s[\sEURO|\sCONTANTI]{0,}\s(.*?)\s/', $testo2, $match);

echo $match[1];  //<--- Outputs "21,00"

Второе решение

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

function getReceiptTotal($receipt){

  preg_match_all('/\d+[\.,]\d+\s/', $receipt, $match);

  $comma = preg_match('/,/', $match[0][0]) ? TRUE : FALSE;

  for($i = 0; $i < count($match[0]); $i++){

    $match[0][$i] = trim($match[0][$i]);

    if($comma){

      $temp[] = preg_replace('/,/', '.', $match[0][$i]);

    } 

  }

  sort($temp);

  $total = end($temp);

  if($comma){

    return preg_replace('/\./', ',', $total);


  } else {

    return $total;

    }

}

echo getReceiptTotal($testo2); //Will output "21,00".

Это должно работать для всех типов чеков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...