3v4l.org

run code in 150+ php & hhvm versions
Bugs & Features
<?php $thisbatch = 1336; $description = 'Betalingskenmerk: 0815-69-AA-700' . "\n" . 'Transactiereferentie:'; $id = 1337; $refer = isolatenew($description); if($refer['result']=='success'){ // Reconciliate by new reference die('SUCCESS' . __LINE__); } elseif ($refer['result']=='fail'){ die('FAIL' . __LINE__); } else { // isolatenew returned partial success $suggestionFound = identify($refer, $id); if ($suggestionFound) { echo "UPDATE bank.transactions SET matched='$thisbatch',matchresult='104 Suggestie mail gestuurd naar operations' WHERE id='$id'\n"; } else { echo "UPDATE bank.transactions SET matched='$thisbatch',matchresult='101 Geen betaalkenmerk in omschrijving' WHERE id='$id'\n"; } } function isolatenew($input){ preg_match('#\d{3,5}[-_./ ]{0,2}\d{1,3}[-_./ ]{0,2}[a-zA-Z]{1,3}[-_./ ]{0,2}\d{3,5}#', $input, $result); if (!$result) { // Try hard, go pro! preg_match('#\d{5,7}[a-zA-Z]{1,3}\d{3,5}#', preg_replace('/[^a-zA-Z0-9]/', '', $input), $result); } if (empty($result)) { return array('result' => 'fail'); } else { //sql voor ophalen transacties van afgelopen week // eerst vervangen we eventuele dubbele streepjes met een enkel streepje $string = str_replace('--', '-', $result[0]); $string = str_replace(array(' ', '.','_','/'), '-', $string); if(strlen($string)==15&&substr_count($string, '-')==3){ $parts = explode('-', $string); if(strlen($parts[0])==4&&strlen($parts[1])==2&&strlen($parts[2])==2&&strlen($parts[3])==4){ return array('result' => 'success', 'return' => array($string)); } } $string = str_replace('-', '', $string); preg_match('/[A-Za-z]{1,3}/', $string, $lettersMatch); if (count($lettersMatch) >= 1) { $letters = $lettersMatch[0]; } else { // "Should never really happen" trigger_error('Bankwire matching: this should never really happen!', E_USER_WARNING); } if(strlen($string)==12&&strlen($letters)==2){ $str = substr($string, 0, 4) . '-' . substr($string, 4,2). '-' . substr($string, 6,2). '-' . substr($string, 8,4); return array('result' => 'success', 'return' => array($str)); } else { //doe exploden op de letters kijken welke onderdelen te salvagen zijn $str = explode($letters, $string); $lettersarray = array(); if(strlen($letters)==1){ $lettersarray = array( $letters.'A', $letters.'B', $letters.'C', $letters.'D', $letters.'E', $letters.'F', $letters.'G', $letters.'H', $letters.'J', $letters.'K', $letters.'L', $letters.'M', $letters.'N', $letters.'P', $letters.'Q', $letters.'R', $letters.'S', $letters.'T', $letters.'U', $letters.'V', $letters.'W', $letters.'X', $letters.'Y', $letters.'Z', 'A'.$letters, 'B'.$letters, 'C'.$letters, 'D'.$letters, 'E'.$letters, 'F'.$letters, 'G'.$letters, 'H'.$letters, 'J'.$letters, 'K'.$letters, 'L'.$letters, 'M'.$letters, 'N'.$letters, 'P'.$letters, 'Q'.$letters, 'R'.$letters, 'S'.$letters, 'T'.$letters, 'U'.$letters, 'V'.$letters, 'W'.$letters, 'X'.$letters, 'Y'.$letters, 'Z'.$letters ); } else if (strlen($letters) == 2) { $lettersarray[] = $letters; } else if(strlen($letters)==3){ $lettersarray[substr($letters, 0, 2)] = substr($letters, 0, 2); $lettersarray[substr($letters, 1, 2)] = substr($letters, 1, 2); $lettersarray[substr($letters, 0, 1).substr($letters, 2, 1)] = substr($letters, 0, 1).substr($letters, 2, 1); } $return[] = substr($string, 0, 4) . '-' . substr($string, 4,2). '-' . substr($string, 6,2). '-' . substr($string, 8,4); foreach($lettersarray as $letter){ $return[] = substr($str[0], 0, 4).'-'.substr($str[0], -2).'-'.$letter.'-'.substr($str[1], 0, 4); $return[] = substr($str[0], 0, 4).'-'.substr($str[0], -2).'-'.$letter.'-'.substr($str[1], 1, 4); } if(strlen($str[0])==6&&strlen($str[1])==4){ return array('result' => 'p_success_3', 'return' => $return, 'original' => $input); } if(strlen($str[0])==6&&strlen($str[1])!=4){ return array('result' => 'p_success_4', 'return' => $return, 'original' => $input); } if(strlen($str[0])!=6&&strlen($str[1])==4){ return array('result' => 'p_success_1_2', 'return' => $return, 'original' => $input); } } } } function findFuzzyMatches ($needle, $haystack, $tolerance = 1) { /* Returns (fuzzy) matches between $needle and elements of $haystack. The selected matches are those having Levenshtein distance up to $tolerance. Give $tolerance = -1 to get all matches. Return type is an associative array: the keys are the Levenshtein distance (integer), the values are sub-arrays containing the elements of $haystack having that distance. E.g.: $needle = 'abc'; $haystack = array('abc', 'abd', 'abe', 'xyz'); returns: array( 0 => array('abc'), 1 => array('abd', 'abe'), 3 => array('xyz') ) */ $matches = array(); // key: distance, value: sub-array with candidates having that distance foreach ($haystack as $candidateKey => $candidate) { // NOTE: Slowness? Use levenshtein, which is the faster function of the two. //$distance = levenshtein($needle, $candidate); // Downside: character swaps cost 2 instead of 1. $distance = DamerauLevenshtein($needle, $candidate); if ($distance <= $tolerance || $tolerance == -1) { if (!array_key_exists($distance, $matches)) { $matches[$distance] = array(); } $matches[$distance][$candidateKey] = $candidate; } } return $matches; } function DamerauLevenshtein($str1, $str2) { $d = Array(); $lenStr1 = strlen($str1); $lenStr2 = strlen($str2); if ($lenStr1 == 0) { return $lenStr2; } if ($lenStr2 == 0) { return $lenStr1; } for ($i=0; $i <= $lenStr1; $i++) { $d[$i] = Array(); $d[$i][0] = $i; } for ($j=0; $j <= $lenStr2; $j++) { $d[0][$j] = $j; } for ($i=1; $i <= $lenStr1; $i++) { for ($j=1; $j <= $lenStr2; $j++) { $cost = substr($str1, $i - 1, 1) == substr($str2, $j - 1, 1) ? 0 : 1; $d[$i][$j] = min( $d[$i - 1][$j] + 1, // deletion $d[$i][$j - 1] + 1, // insertion $d[$i - 1][$j - 1] + $cost // substitution ); if ( $i > 1 && $j > 1 && substr($str1, $i - 1, 1) == substr($str2, $j - 2, 1) && substr($str1, $i - 2, 1) == substr($str2, $j - 1, 1) ) { $d[$i][$j] = min( $d[$i][$j], $d[$i - 2][$j - 2] + $cost // transposition ); } } } return $d[$lenStr1][$lenStr2]; } function identify($refer, $bankTransactionID){ /* Returns whether a mail suggestion was sent to operations. If not, no sensible suggestion was found and the transaction should be rolled back. */ $suggestionFound = false; $weekstransactions = array(1338 => '0815-69-AA-7007'); foreach($refer['return'] as $reference){ $match = findFuzzyMatches($reference, $weekstransactions, 2); // $match contains all matches grouped by distance. Every match inside such a distance-array is keyed by its original saleID. $matches[$reference] = $match; } $mailbody = 'Input: "'.$refer['original'].'"'."\r\n"; $mailbody .= 'bank.transaction.id: '.$bankTransactionID."\r\n\r\n"; foreach($refer['return'] as $reference){ $mailbody .= 'mogelijke reference waarop we hebben gezocht: ' . $reference."\r\n"; if (empty($matches[$reference])) { $mailbody .= 'Niet gevonden!' . "\r\n\r\n"; } else { foreach($matches[$reference] as $key => $possibles){ $mailbody .= 'waarschijnlijkheid: ' . $key."\r\n"; foreach($possibles as $saleID => $possible){ $mailbody .= 'saleID: ' . $saleID."\r\n"; $mailbody .= 'reference: ' . $possible."\r\n"; $suggestionFound = true; } $mailbody .= "\r\n"; } $mailbody .= "\r\n\r\n"; } } if ($suggestionFound) { //mail('steven@targetmedia.nl', 'Bankwire', $mailbody); print 'MAILING' . "\n\n" . $mailbody; } return $suggestionFound; }
Output for 5.3.0 - 5.6.28, hhvm-3.10.0 - 3.12.0, 7.0.0 - 7.1.0
MAILING Input: "Betalingskenmerk: 0815-69-AA-700 Transactiereferentie:" bank.transaction.id: 1337 mogelijke reference waarop we hebben gezocht: 0815-69-AA-700 waarschijnlijkheid: 1 saleID: 1338 reference: 0815-69-AA-7007 mogelijke reference waarop we hebben gezocht: 0815-69-AA-700 waarschijnlijkheid: 1 saleID: 1338 reference: 0815-69-AA-7007 mogelijke reference waarop we hebben gezocht: 0815-69-AA-00 waarschijnlijkheid: 2 saleID: 1338 reference: 0815-69-AA-7007 UPDATE bank.transactions SET matched='1336',matchresult='104 Suggestie mail gestuurd naar operations' WHERE id='1337'