PHP/JS 文本差异

PHP/JS Text Diff

本文关键字:文本 JS PHP      更新时间:2023-09-26

首先,这是这四个问题的精确重复:

  • 突出显示 PHP 中两个字符串之间的区别
  • 基于 JavaScript 的 diff 实用程序
  • 如何使用PHP进行文本差异?
  • 在 PHP 中计算文本差异

自从第一次提出这些问题以来,时代似乎已经发生了变化,我想知道现在什么是进行这种比较的好工具?我已经看过(除了这些问题):

  • https://github.com/nuxodin/diff_match_patch-php
  • http://pear.php.net/package/Text_Diff
  • https://github.com/paulgb/simplediff/blob/5bfe1d2a8f967c7901ace50f04ac2d9308ed3169/simplediff.php
  • http://www.raymondhill.net/finediff/viewdiff-ex.php

但是我得到的所有那些现在要么是无人保护的,要么看起来有点狡猾,因为它们没有那么多使用(有些甚至暗示它们不是很高性能),梨子让我担心。我讨厌为一个小模块安装 PEAR,不仅如此,而且与 PEAR 相比,似乎从我自己的窗户扔一块砖头来安装这么小的模块,不仅如此,而且该模块已被取代并放置在不同的通道上(不知道为什么?如果PEAR版本是我唯一的选择,我会使用PEAR版本,但我想使用最新的软件包。

有谁知道一个使用良好且当前维护或内置的函数(即使它是PHP扩展)用于PHP和/或JavaScript(JQuery)的文本差异?

好的,已经有一段时间了。

我实际上决定环顾四周,看看其他人使用什么,并偶然发现了Yii(http://www.yiiframework.com)使用的东西。

他们实际上将PEAR模块用于他们的text_diff,并在部落频道上以新形式使用它。看起来text_diff现在是一个部落项目,但你可以很容易地将它的一个版本集成到你的应用程序中,这就是 Yii 默认所做的(它预先捆绑了一个版本)。

所以我四处搜索了一下,以了解他们如何使用它以及如何进入它,我遇到了:

public function actionDiff()
{
    Yii::import('gii.components.TextDiff');
    $model=$this->prepare();
    if(isset($_GET['id']) && isset($model->files[$_GET['id']]))
    {
        $file=$model->files[$_GET['id']];
        if(!in_array($file->type,array('php', 'txt','js','css')))
            $diff=false;
        elseif($file->operation===CCodeFile::OP_OVERWRITE)
            $diff=TextDiff::compare(file_get_contents($file->path), $file->content);
        else
            $diff='';
        $this->renderPartial('/common/diff',array(
            'file'=>$file,
            'diff'=>$diff,
        ));
    }
    else
        throw new CHttpException(404,'Unable to find the code you requested.');
}

CCodeGenerator他们的 Gii 模块 ( http://www.yiiframework.com/doc/api/1.1/CCodeGenerator/)。重要的部分是它们实际连接到PEAR模块的位置:

$diff=TextDiff::compare(file_get_contents($file->path), $file->content);

通过读取两个文件的内容,产生diffed输出。

最初我不想使用 PEAR,因为臃肿,但这个模块对于功能齐全的text_diff来说非常薄,所以我决定使用它。不仅如此,目前,它是唯一真正为我工作的text_diff模块,所以我会保持最好的,即使最好的非常需要内存。

您是否在此线程上尝试了菲利普的两个解决方案之一?

此处引用:

在 PHP 中,array_diff 将第一个数组与第二个数组进行比较,并且 返回差额。

$a1 = str_split('abcdefghijklmnop');
$a2 = str_split('abcdefghi');
echo join('', array_diff($a1, $a2)); // jklmnop

这也将起作用:

$s1 = 'abcdefghijklmnop';
$s2 = 'abcdefghi';
echo str_replace(str_split($s2), '', $s1); // jklmnop

这也可以处理$s2 = 'ghiabcdef';,因为str_replace()被喂食 数组,而不是字符串。