Here is a string resynch function:
<?php
function str_resynch($a,$b,$l=32,$s=2048) {
$r=array();
for($i=0,$c=strlen($a),$cc=strlen($b),$ii=0,$z=$s-1,$z2=($z<<1)+1; $i<$c; $i++) {
$d=$i-$z;
$d=($d<$ii)?substr($b,$ii,$z2-$ii+$d):substr($b,$d,$z2);
$p=strpos($d,$a{$i});
$n=0;
while ($p!==FALSE) {
$m=1;
$bi=$i;
$bp=$p;
$p+=$ii;
while ((++$i<$c) && (++$p<$cc)) {
if ($a{$i}!=$b{$p}) break;
$m++;
}
if ($m<$l) {
$i=$bi;
$n=$bp+1;
$p=@strpos($d,$a{$i},$n);
}
else {
$i--;
$r[]=array($bi,$bp+$ii,$m); $ii=$p;
break;
}
}
}
if (!count($r)) return ($cc)?array('/',0,$c,0,$cc):array(array('+',0,$c,0,0));
$o=array();
$bi=0;
$bp=0;
for($i=0,$m=count($r);$i<$m;$i++) {
if ($r[$i][0]!=$bi) {
if ($r[$i][1]!=$bp) {
$o[]=array('/',$bi,$r[$i][0]-$bi,$bp,$r[$i][1]-$bp);
$bi=$r[$i][0];
$bp=$r[$i][1];
}
else {
$o[]=array('+',$bi,$r[$i][0]-$bi,$bp,0);
$bi=$r[$i][0];
}
}
elseif ($r[$i][1]!=$bp) {
$o[]=array('-',$bi,0,$bp,$r[$i][1]-$bp);
$bp=$r[$i][1];
}
$o[]=array('=',$r[$i][0],$r[$i][2],$r[$i][1],$r[$i][2]);
$bi+=$r[$i][2];
$bp+=$r[$i][2];
}
if ($c!=$bi) {
if ($cc!=$bp) $o[]=array('/',$bi,$c-$bi,$bp,$cc-$bp);
else $o[]=array('+',$bi,$c-$bi,$bp,0);
}
elseif ($cc!=$bp) $o[]=array('-',$bi,0,$bp,$cc-$bp);
return $o;
}
?>