static function diff($before, $after, $mode = "w") { switch ($mode) { case 'c': $lb = strlen($before); $la = strlen($after); break; case 'w': $before = self::splitString($before, " \t", "\r\n", $posb); $lb = count($before); $after = self::splitString($after, " \t", "\r\n", $posa); $la = count($after); break; case 'l': $before = self::splitString($before, "\r\n", '', $posb); $lb = count($before); $after = self::splitString($after, "\r\n", '', $posa); $la = count($after); break; default: return false; } $diff = array(); for ($b = $a = 0; $b < $lb && $a < $la;) { for ($pb = $b; $a < $la && $pb < $lb && $after[$a] === $before[$pb]; ++$a, ++$pb) { } if ($pb !== $b) { $diff[] = array('change' => '=', 'position' => $mode === 'c' ? $b : $posb[$b], 'length' => $mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b]); $b = $pb; } if ($b === $lb) { break; } for ($pb = $b; $pb < $lb; ++$pb) { for ($pa = $a; $pa < $la && $after[$pa] !== $before[$pb]; ++$pa) { } if ($pa !== $la) { break; } } if ($pb !== $b) { $diff[] = array('change' => '-', 'position' => $mode === 'c' ? $b : $posb[$b], 'length' => $mode === 'c' ? $pb - $b : $posb[$pb] - $posb[$b]); $b = $pb; } if ($pa !== $a) { $position = $mode === 'c' ? $a : $posa[$a]; $length = $mode === 'c' ? $pa - $a : $posa[$pa] - $posa[$a]; $change = array('change' => '+', 'position' => $position, 'length' => $length); $diff[] = $change; $a = $pa; } } if ($a < $la) { $position = $mode === 'c' ? $a : $posa[$a]; $length = $mode === 'c' ? $la - $a : $posa[$la] - $posa[$a]; $change = array('change' => '+', 'position' => $position, 'length' => $length); $diff[] = $change; } return self::$diff = $diff; }