PHP库生成代码diff(github样式)?

时间:2013-03-08 21:25:07

标签: php diff git-diff

我正在寻找一个可以生成代码差异HTML的免费php库。基本上就像GitHub的代码差异化页面一样。

我一直在四处搜寻,找不到任何东西。有没有人知道那些我正在寻找的东西?

3 个答案:

答案 0 :(得分:5)

看起来我在使用不同的措辞进行更多Google搜索后找到了我正在寻找的内容。

php-diff似乎完全符合我的要求。只是一个接受两个字符串并生成所有HTML的php函数会在网页中显示差异。

答案 1 :(得分:2)

在这里加我的两分钱......

不幸的是,在PHP中没有用于显示/生成差异的真正好的差异库。也就是说,我最近确实找到了一种使用PHP来做到这一点的迂回方式。解决方案包括:

  • 用于呈现Diff
  • 的纯JavaScript方法
  • 使用PHP转出git以生成要呈现的Diff

首先,有一个优秀的 JavaScript库,用于呈现名为diff2html的GitHub样式差异。这使得差异非常干净,具有现代风格。但是diff2html需要一个 true git diff来渲染,因为它意在渲染git diffs - 就像GitHub一样。

如果我们让diff2html处理diff的渲染,那么我们剩下要做的就是创建git diff来让它渲染。

要在PHP中执行此操作,您可以使用服务器上运行的本地git二进制文件。您可以使用git使用--no-index选项计算两个任意文件的差异。您还可以使用-U选项指定要返回的差异之前/之后的行数。

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

// 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);
}

答案 2 :(得分:1)

我认为你要找的是xdiff

  

xdiff扩展使您可以创建和应用包含不同修订版本文件之间差异的修补程序文件。

     

此扩展支持两种操作模式 - 字符串和文件,以及两种不同的补丁格式 - 统一和二进制。统一补丁非常适合文本文件,因为它们易于阅读且易于查看。对于档案或图像等二进制文件,二进制补丁将是适当的选择,因为它们是二进制安全的并且可以很好地处理不可打印的字符。