PHP库生成差异代码(github风格)?

kri*_*che 5 php diff git-diff

我正在寻找一个免费的PHP库,可以生成与HTML相对应的代码。基本上就像GitHub的代码差异页面一样。

我一直在搜索,找不到任何东西。有人知道我在寻找什么吗?

kri*_*che 7

在用不同的措词进行更多Google搜索之后,我似乎找到了我想要的东西。

php-diff似乎正是我想要的。只是一个php函数,它接受两个字符串并生成所有HTML并在网页中显示差异。


DJ *_*ipe 7

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

不幸的是,在 PHP 中没有用于显示/生成差异的真正好的差异库。也就是说,我最近确实找到了一种使用 PHP 执行此操作的迂回方法。解决方案涉及:

  • 一种用于呈现 Diff 的纯 JavaScript 方法
  • git使用 PHP 进行炮击以生成要呈现的 Diff

首先,有一个优秀的JavaScript 库用于呈现 GitHub 风格的差异,称为diff2html。这使差异非常干净且具有现代风格。但是diff2html需要一个真正的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);
Run Code Online (Sandbox Code Playgroud)

然后你需要$diff回到前端。您应该查看的文档进行diff2html,但最终的结果看起来在JavaScript这样的事情(假设你传递$diffdiffString):

function renderDiff(el, diffString) {
    var diff2htmlUi = new Diff2HtmlUI({diff: diffString});
        diff2htmlUi.draw(el);
}
Run Code Online (Sandbox Code Playgroud)