private function FindMatch($startInOld, $endInOld, $startInNew, $endInNew)
{
$bestMatchInOld = $startInOld;
$bestMatchInNew = $startInNew;
$bestMatchSize = 0;
$matchLengthAt = array();
for ($indexInOld = $startInOld; $indexInOld < $endInOld; $indexInOld++) {
$newMatchLengthAt = array();
$index = $this->oldWords[$indexInOld];
if ($this->IsTag($index)) {
$index = $this->StripTagAttributes($index);
}
if (!isset($this->wordIndices[$index])) {
$matchLengthAt = $newMatchLengthAt;
continue;
}
foreach ($this->wordIndices[$index] as $indexInNew) {
if ($indexInNew < $startInNew) {
continue;
}
if ($indexInNew >= $endInNew) {
break;
}
$newMatchLength = (isset($matchLengthAt[$indexInNew - 1]) ? $matchLengthAt[$indexInNew - 1] : 0) + 1;
$newMatchLengthAt[$indexInNew] = $newMatchLength;
if ($newMatchLength > $bestMatchSize) {
$bestMatchInOld = $indexInOld - $newMatchLength + 1;
$bestMatchInNew = $indexInNew - $newMatchLength + 1;
$bestMatchSize = $newMatchLength;
}
}
$matchLengthAt = $newMatchLengthAt;
}
return $bestMatchSize != 0 ? new Match($bestMatchInOld, $bestMatchInNew, $bestMatchSize) : null;
}