php实现diff
PHP实现文本差异比较(Diff)
PHP提供多种方式实现文本差异比较,以下为常用方法及实现示例:
使用内置函数array_diff()
适用于简单数组差异比较,但无法直接处理字符串或复杂结构。
$array1 = ['a', 'b', 'c'];
$array2 = ['a', 'c', 'd'];
$diff = array_diff($array1, $array2); // 返回['b']
使用PEAR包Text_Diff
需先安装PEAR扩展包,适合处理多行文本差异。
require_once 'Text/Diff.php';
require_once 'Text/Diff/Renderer.php';
$oldText = "line1\nline2\nline3";
$newText = "line1\nline4\nline3";
$diff = new Text_Diff('auto', [explode("\n", $oldText), explode("\n", $newText)]);
$renderer = new Text_Diff_Renderer();
echo $renderer->render($diff);
使用SebastianBergmann/Diff组件
通过Composer安装的现代Diff库,支持多种输出格式。
composer require sebastian/diff
use SebastianBergmann\Diff\Differ;
$differ = new Differ();
echo $differ->diff("Old text\nLine2", "New text\nLine2");
自定义实现基于LCS算法
适合需要深度定制的场景,以下为简化版实现:
function computeLCS($str1, $str2) {
$len1 = strlen($str1);
$len2 = strlen($str2);
$dp = array_fill(0, $len1 + 1, array_fill(0, $len2 + 1, 0));
for ($i = 1; $i <= $len1; $i++) {
for ($j = 1; $j <= $len2; $j++) {
if ($str1[$i - 1] == $str2[$j - 1]) {
$dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
} else {
$dp[$i][$j] = max($dp[$i - 1][$j], $dp[$i][$j - 1]);
}
}
}
return $dp[$len1][$len2];
}
使用xdiff扩展
需安装PHP扩展,适合二进制或大文件差异比较。
if (function_exists('xdiff_string_diff')) {
$diff = xdiff_string_diff($oldStr, $newStr);
file_put_contents('diff.patch', $diff);
}
安装扩展命令:
pecl install xdiff
输出HTML高亮差异
结合Diff库生成可视化结果:
use SebastianBergmann\Diff\Differ;
use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
$builder = new UnifiedDiffOutputBuilder("<del>%s</del><ins>%s</ins>");
$differ = new Differ($builder);
echo $differ->diff($oldText, $newText);
性能优化建议
- 对于大文件处理,建议使用流式处理或分块比较
- 内存敏感场景优先选择
xdiff扩展 - 需要版本控制集成时考虑调用
git diff等外部命令







