当前位置: 首页 > 后端技术 > PHP

Filecomparisonextension

时间:2023-03-29 18:17:57 PHP

PHP中的文件比较这个扩展现在用的比较少,因为大多数情况下我们都在使用一些代码管理工具,比如Git或者Svn,其实它的功能和这类工具很相似,还有也是一个非常常用的BeyondCompare工具,可以让我们方便的比较文件。安装与准备这个文件在PHP中的扩展名为xdiff扩展,我们可以直接在pecl中下载安装。需要注意的是,安装这个扩展需要操作系统安装libxdiff工具。该工具的官网地址在文末参考链接中。libxdiff无法使用默认yum安装,需要自行下载安装。和其他Linux工具一样,安装过程也很简单,这里就不赘述了。xdiff扩展支持字符串和文件的差异比较以及一些相关操作。这里主要讲解对字符串的操作,最后会给出与文件相关的操作。所有操作函数的使用。首先,我们需要定义一些字符串和相关文件,以供后续操作使用。$old_article="我非野行者,浪迹天涯,奉命暂住名山,不由适应,看破尘埃烦恼,怎能享受闲暇。流霞细吟诗。我与白云同在。";$new_article="我不是野旅人,浪迹天涯,奉命暂住名山。我不禁随机应变,看破尘埃烦恼,何来闲情。一等霞认真吟诗,与白云相伴。";$new_article1="我是非野客,云游四海,奉命住名山一时,不由顺应。细吟诗。与白云为伴。三一四一”;file_put_contents('old_file.txt',$old_article);file_put_contents('new_file.txt',$new_article);file_put_contents('new_file1.txt',$new_article1);stringdiff=xdiff_string_diff($old_article,$new_article);var_dump($diff);//string(273)"@@-1,4+1,4@@//我本来是个流浪者,四处游荡世界。//我被任命在名山中居住一段时间。//-看破尘埃烦恼,何来闲暇。//+看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。//\Nonewlineatendoffile//"使用xdiff_string_diff()函数获取两个字符串的差异信息,可以看到其内容结构与Git的文件差异比较返回的内容非常相似。就像使用As只要我们用过Git或者Svn,就一定很熟悉+和-表示的行的区别Mergestringvar_dump(xdiff_string_merge3($old_article,$new_article,$new_article1,$error));//string(180)“我本是野客,浪迹天涯。//一时被命名为名山。不可避免的即兴创作。//看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。"var_dump($error);//NULLxdiff_string_merge3()函数用于将三个字符串合并在一起,这也类似于Git中的merge函数。不过这个函数需要三个字符串,但是通过测试我们发现只有第一个第一个\$new_article和原来的$old_article合并成功,第三个$new_article1没有合并到最终返回的字符串中,我没有找到任何相关的参考资料,说这个函数的功能和实际效果不一致,官方文档的介绍也很简单,所以如果你知道这个功能的真实和具体情况,可以留言一起讨论!$error参数是一个可选的参考参数,如果在合并过程中出现问题,就会返回错误信息.补丁数据(patch)var_dump(xdiff_string_patch($old_article,$diff,XDIFF_PATCH_NORMAL,$errors));//string(180)“我从来都不是野人,在世界各地流浪。//一时被命名为名山。不可避免的即兴创作。//看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。"var_dump($errors);//NULL从函数名中的patch可以看出,这个xdiff_string_patch()是用来patch差异字符串的。在过去的桌面时代,无论是操作系统还是各种游戏,都会经常更新各种补丁。这里的patch其实和mergedifference差不多。它的第一个参数是原始字符串,第二个参数是xdiff_string_diff()产生的差异数据。打补丁的结果是返回正式全量合并差异后的字符串。第三个参数是可选的,也可以定义为XDIFF_PATCH_REVERSE,即反转补丁,只返回原始数据,不返回差异合并的结果。反之,使用这个参数,我们可以将第一个参数设置为修改后的$new_article,然后再反转回原来的数据。你可以自己试试。最后一个参数也是一个可选的引用类型的错误变量。二进制补丁数据$patchBinary=xdiff_string_bdiff($old_article,$new_article);var_dump($patchBinary);//string(44)"?{?N?一//流霞重酒?!"var_dump(xdiff_string_bdiff_size($patchBinary));//int(180)var_dump(xdiff_string_bpatch($old_article,$patchBinary));//string(180)"我本来是个野旅人,浪迹天涯。而。难免适应。//看破尘埃烦恼,何来闲暇。1//流霞细吟诗。与白云。”除了对原文进行字符串操作,我们还可以使用xdiff_string_bdiff()返回二进制字符串差分结果。类似地,xdiff_string_bpatch()可以用来修补这个二进制字符串操作的结果,即合并差异。另外,二分运算中还有一个函数xdiff_string_bdiff_size(),用于返回二分差函数返回结果中字符的长度。//int(193)var_dump(xdiff_string_bpatch($old_article,$raPatchBinary));//string(193)"我不是野旅人,我在世界各地流浪。//我被命名为住在名山一时。不由得顺应。2//看破尘埃烦恼,何来闲情。//柳霞细吟诗。与白云为伴。//3141”还有一个最后是xdiff_string_rabdiff(),同样返回二进制数据差异信息。它与xdiff_string_bdiff()的主要区别在于所使用的算法。文件操作上面我们已经详细介绍了xdiff扩展对字符串的操作。它还提供了对文件的一系列操作。使用这些函数直接操作文件,真的和我们的Git这样的工具非常相似。$old_file='old_file.txt';$new_file='new_file.txt';$new_file1='new_file1.txt';$diff_file='file.diff';$merge_file='merge.txt';$patch_file='补丁.diff';echo"FileDiff:",PHP_EOL;$patch=xdiff_file_diff($old_file,$new_file,$diff_file);var_dump($patch);//bool(true)var_dump(file_get_contents($diff_file));//string(273)"@@-1,4+1,4@@//我本来是个野旅人,浪迹天涯//一时被点名居名山,不由顺应。//-看破尘埃烦恼,何以自得其乐。//+看破尘埃烦恼,何以安逸。可否悠闲。1//柳霞细吟诗。白云为伴。//\文件末尾没有换行符//"echo'FileMerge:',PHP_EOL;var_dump(xdiff_file_merge3($old_file,$new_file,$new_file1,$merge_file));//string(307)"@@-1,4+1,5@@//我本来是个野旅人,浪迹天涯。//-一时名山。不可避免的即兴创作。//+一时名山。不可避免的即兴创作。二//看破尘埃烦恼,何来闲暇。//-刘霞仔细地吟唱圣歌。并与白云作伴。+柳霞细细吟诗。并与白云作伴。//+3141"var_dump(file_get_contents($merge_file));//string(180)"我不是野客,浪迹天涯。//一时被命名为名山。不可避免的即兴创作。//看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。"echo"文件补丁:",PHP_EOL;var_dump(xdiff_file_patch($old_file,$diff_file,$patch_file,XDIFF_PATCH_NORMAL));//bool(true)var_dump(file_get_contents($patch_file));//string(180)"I无如野客,游走人间。//一时被命名为名山。不可避免的即兴创作。//看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。"echo"FileBinaryDiff:",PHP_EOL;$patchBinary=xdiff_file_bdiff($old_file,$new_file,$diff_file);var_dump($patchBinary);//bool(true)var_dump(file_get_contents($diff_file));//字符串(44)"?{?N?一//六霞美酒?!"var_dump(xdiff_file_bdiff_size($diff_file));//int(180)var_dump(xdiff_file_bpatch($old_file,$patchBinary,$patch_file));//bool(false)var_dump(file_get_contents($patch_file));//string(180)"我本来是一个流浪者,浪迹天涯。//一时被命名为名山。不可避免的即兴创作。//看破尘埃烦恼,何来闲暇。一//柳霞细吟诗。并与白云作伴。"echo"FileRABinaryDiff:",PHP_EOL;$raPatchBinary=xdiff_file_rabdiff($old_file,$new_file1,$diff_file);var_dump($raPatchBinary);//bool(true)var_dump(file_get_contents($diff_file));//string(46)"?{?N?X2XY//3141"var_dump(xdiff_file_bdiff_size($diff_file));//int(193)var_dump(xdiff_file_bpatch($old_file,$raPatchBinary,$patch_file));//bool(false)var_dump(file_get_contents($patch_file));//string(193)"我本来是一个流浪者,在世界各地流浪。//一时被命名为名山。不可避免的即兴创作。二//看破尘埃烦恼,何来闲暇。//柳霞认真吟诗。并与白云作伴。//3141》这里就不一一解释了,这些函数的操作和作用与字符串操作相关的类似,只是参数略有不同,比如会生成一个文件,参数所有的功能都是基于文件的,大家可以自己跑测试代码,参考官方文档学习,综上,这个xdiff扩展我们用的不多,但是开源的看过一套这套的extensions用于在使用PHP的CMS系统中管理前端模板页面的功能,任何工具的存在都有它的意义,也许你在为某个功能而烦恼的时候刚看到这个,这就是我们文档的意思.测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/10.PHP.php中文件对比扩展参考文档:https://www.php.net/manual/zh/book.xdiff.phphttps://directory.fsf.org/wiki/LibXDiff各媒体平台均可搜索hed[硬核项目经理]