This php class will take two strings and return a html diff of them with the <ins> and <del> html tags representing what was deleted and inserted. It makes it easy to visually compare strings.
class Diff { public static function diffArray($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( self::diffArray(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)), array_slice($new, $nmax, $maxlen), self::diffArray(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen))); } public static function htmlDiff($old, $new){ $ret = ''; $diff = self::diffArray(explode(' ', $old), explode(' ', $new)); foreach($diff as $k){ if(is_array($k)){ $ret .= (!empty($k['d'])?'<del>'.implode(' ',$k['d']).'</del> ':'').(!empty($k['i'])?'<ins>'.implode(' ',$k['i']).'</ins> ':''); }else{ $ret .= $k . ' '; } } return $ret; } }
Example usage
echo Diff::htmlDiff('I went to the store', 'We went to the store');
Output
I We went to the store
Thanks! Struggling for an hour with two strings not matching and can’t see the difference. This is exactly what I needed! (modified to make file name = class name and add namespace.)