代码对比 版本差异 代码对比工具 本地代码对比工具 类似svn,git代码对比工具 原始文本和编辑文本之间的区别 实现高粒度diff

代码对比原理

无论是svn或者github还是本文讲述的工具类,都是基于一个原理:

两个文件对比,举例:文件A和文件B,假如以A为为模板,B为比较文件,那么有以下几个步骤

1.读取A文件,去掉HTML的标签,然后把文件内容拆分成数组A1

2.读取B文件,去掉HTML的标签,然后把文件内容拆分成数组B1

3.以A1为标准数组,循环比较B1数组相同位置数据

4.标记不同数据并标记,并组成标记文件C

5.返回标记好的数组,转换成为文件后返回A标准文件和C

主要代码:

$from :相当于前面的A文件转换成的文件
$opcodes:相当于前面的B文件转换成的文件

public static function renderFromOpcodes($from, $opcodes, $callback) {
   if ( !is_callable($callback) ) {
      return;
      }
   $opcodes_len = strlen($opcodes);
   $from_offset = $opcodes_offset = 0;
   while ( $opcodes_offset <  $opcodes_len ) {
      $opcode = substr($opcodes, $opcodes_offset, 1);
      $opcodes_offset++;
      $n = intval(substr($opcodes, $opcodes_offset));
      if ( $n ) {
         $opcodes_offset += strlen(strval($n));
         }
      else {
         $n = 1;
         }
      if ( $opcode === 'c' ) { // copy n characters from source
         call_user_func($callback, 'c', $from, $from_offset, $n, '');
         $from_offset += $n;
         }
      else if ( $opcode === 'd' ) { // delete n characters from source
         call_user_func($callback, 'd', $from, $from_offset, $n, '');
         $from_offset += $n;
         }
      else /* if ( $opcode === 'i' ) */ { // insert n characters from opcodes
         call_user_func($callback, 'i', $opcodes, $opcodes_offset + 1, $n);
         $opcodes_offset += 1 + $n;
         }
      }
   }

效果展示

 扩展下载地址

http://download.pear.php.net/package/Text_Diff-1.1.1.tgz

代码示例

//获取标准的字符串

$strmark = “”;

//获取需要对比的字符串

$str = “”;

//引入资源

require_once 'static/diff/PHP-FineDiff-master/finediff.php';

$opcodes = FineDiff::getDiffOpcodes($strmark, $str);

$str =  FineDiff::renderDiffToHTMLFromOpcodes($strmark, $opcodes);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值