生成代码差异的PHP库(类似于GitHub风格)?

8
我正在寻找一个免费的 PHP 库,可以生成代码差异的 HTML。基本上就像 GitHub 的代码差异页面一样。
我已经四处搜索,但找不到任何东西。有没有人知道是否有类似的工具可用?

搜索 "PHP diff" 出现了几个有前途的条目。 https://github.com/chrisboulton/php-diff - Brad
不是免费的,但可以生成基于 PHP 语言结构的代码差异,而不是基于行。请参见 http://www.semanticdesigns.com/Products/SmartDifferencer/PHPSmartDifferencer.html 它可以产生类似 diff 的输出,或者是机器可读的输出,可以轻松转换为 HTML。 - Ira Baxter
3个回答

9

通过使用不同的搜索词进行更多的Google搜索,我似乎找到了我要找的东西。

php-diff 看起来正是我想要的。它只是一个 PHP 函数,接受两个字符串并生成所有 HTML,以便在网页上显示差异。


看起来已经过时又有 bug,去“问题”那里看一下。我建议使用 xdiff 来进行差异比较,使用 diff2html 来查看差异结果。(并且因为 xdiff 是一个二进制扩展,也许它比 PHP 函数更快)。 - chang zhao

8

在这里我想要补充一点……

不幸的是,PHP 中没有真正好用的 diff 库来显示/生成 diffs。不过,最近我找到了一种迂回的方法来使用 PHP 进行此操作。解决方案包括:

  • 使用纯 JavaScript 方法来渲染 Diff
  • 通过 PHP 调用 git 来生成 Diff 以进行渲染

首先,有一个优秀的 JavaScript 库可以呈现 GitHub 风格的 diffs,叫做diff2html。它以现代化的样式非常干净地呈现 diffs。然而,diff2html 需要一个真正的 git diff 才能呈现,因为它旨在像 GitHub 一样直接呈现 git diffs。

如果我们让 diff2html 处理 diff 的呈现,那么我们所需要做的就是创建 git diff 以使其呈现。

要在 PHP 中实现这个目标,你可以调用运行在服务器上的本地 git 二进制文件。你可以使用 git 计算两个任意文件之间的 diff,使用 --no-index 选项。你还可以使用 -U 选项指定要返回的找到的 diffs 前/后多少行。

在服务器上,它看起来可能像这样:

// File names to save data to diff in
$leftFile  = '/tmp/fileA.txt'; 
$rightFile = '/tmp/fileB.txt';

file_put_contents($leftFile, $leftData);
file_put_contents($rightFile, $rightData);

// Generate git diff and save shell output
$diff = shell_exec("git diff -U1000 --no-index $leftFile $rightFile");

// Strip off first line of output
$diff = substr($diff, strpos($diff, "\n"));

// Delete the files we just created
unlink($leftFile);
unlink($rightFile);

然后您需要将$diff返回到前端。您应该查看diff2html文档,但最终在JavaScript中的结果将类似于以下内容(假设您将$diff传递为diffString):

function renderDiff(el, diffString) {
    var diff2htmlUi = new Diff2HtmlUI({diff: diffString});
        diff2htmlUi.draw(el);
}

谢谢,这真的很有帮助。 - Momen Shaker

2
我认为你所需要的是 xdiff
xdiff扩展允许您创建和应用包含文件不同版本之间差异的补丁文件。此扩展支持两种操作模式 - 字符串和文件,以及两种不同的补丁格式 - 统一和二进制。统一补丁非常适用于文本文件,因为它们易读且易于审查。对于像存档或图像这样的二进制文件,二进制补丁是一个很好的选择,因为它们对二进制文件安全,并可以很好地处理非可打印字符。

注意:我认为这不适用于PHP 7,或者至少我无法安装它。 - starbeamrainbowlabs
现在有版本2可以与PHP 7一起使用。也许它更适合创建差异,并且可以与diff2html结合使用进行查看。(而php-diff似乎已经过时,请参见“问题”那里)。 - chang zhao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接