Search code examples
phpstring-matchingword-diff

highlight sequentially different word in PHP


I want to highlight sequentially different between 2 string word in PHP, suppose I have 2 String like below.

$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";

The highlighted words should be Arab To -092541 and KDS. so far I have tried the below code.

<?php
function compare_strings($array1, $array2) {
$array1 = explode(" ", $array1);
$array2 = explode(" ", $array2);
$arSize1=count($array1);
$arSize2=count($array2);
$index=0;
  if($arSize1<$arSize2){
    for($i=0;$i<$arSize1;$i++){
      if($array1[$i]==$array2[($i+$index)]){
          echo ' '.$array1[$i];
      }
      else{
          echo ' <b>'.$array2[($i+$index)].'</b>'; 
          $index++;
          $i--;
      }
    }

  }
}
$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";
echo $string1.'<br/>';
compare_strings($string1,$string2);
?>

this code works fine if I only add words, like Arab To and KDS and don't change existing word -092541. when I change -09254 to -092541 it's start a infinite loop and shows Undefined array key error.

Expected highlighted words are Arab TO -092541 KDS

I tried below answers/libraries but none of these worked for my situation.

@Arif 's answer for a similar question
Side-by-side
class.Diff.php

Any help/guidance will be very appreciated.


Solution

  • simplediff library did my job, I just had to modify code to meet my requirement.

    <?php
    function diff($old, $new){
        $matrix = array();
        $maxlen = 0;
        foreach($old as $oindex => $ovalue){
            $nkeys = array_keys($new, $ovalue);
            foreach($nkeys as $nindex){
                $matrix[$oindex][$nindex] = isset($matrix[$oindex - 1][$nindex - 1]) ?
                    $matrix[$oindex - 1][$nindex - 1] + 1 : 1;
                if($matrix[$oindex][$nindex] > $maxlen){
                    $maxlen = $matrix[$oindex][$nindex];
                    $omax = $oindex + 1 - $maxlen;
                    $nmax = $nindex + 1 - $maxlen;
                }
            }   
        }
        if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new));
        return array_merge(
            diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)),
            array_slice($new, $nmax, $maxlen),
            diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen)));
    }
    
    $string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
    $string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";
    $arr=diff(explode(" ",$string1),explode(" ",$string2));
    echo $string1.'<br/>';
    $ret = '';
    foreach($arr as $k){
            if(is_array($k)){
                $ret .= (!empty($k['i'])?"<b>".implode(' ',$k['i'])."</b> ":'');
            }
            else {
              $ret .= $k . ' ';
            }
        }
    echo $ret;
    ?>
    

    output:

    TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS
    Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212