代码对比原理
无论是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);