需求小能手——文本对比

前言

前段时间做项目看到了一个文本对比的需求,该需求虽然没有交给我做但是觉得有意思,当时也向大佬请教了一下如何实现的,本节就来讲解一下实现过程。

实现

文本对比效果很简单,就是将两段文本不同的地方显示出来,我们随便搜索一下就能找到文本对比在线工具,这种大概率就有第三方库了,大佬就是用diff-match-patch库完成的。

diff-match-patch

diff-match-patch的名字对应了它三个功能diff(差异)、match(匹配)、patch(补丁),这三个功能都是针对文本而言的,文本对比对应的就是它的diff功能 ,diff用于比较两个纯文本块并且返回差异列表,官网有具体的demo,里面还有三种处理方式:

除此之外它还支持多种语言,前后端都能使用。

我们需要使用的就是js语言,点进js文件夹找到diff_match_patch.js文件,我们将其下载下来,通过script方式引入即可。利用diff_match_path文本对比功能实现起来就非常的简单,具体步骤如下:

  1. 引入js文件然后new一个dmp实例。
  2. 通过dmp的diff_main方法获取两个文本之间的差异,该方法返回一个差异数组,注意该差异是前者相对于后者的差异。
  3. 通过dmp的diff_prettyHtml 方法将文本差异转换成html代码,将其渲染出来当作文本对比的最终结果。 按照以上步骤我们写个小demo:

API

上面demo中使用了dmp的两个方法,除此之外还有其他API,我们一起来了解下:

  • diff_main(text1,text2):获取文本之间的差异,上面我们提到了它会返回差异数组,每一项有两个元素,第一个由-1(删除)、0(相等)、1表示(插入);第二个就是文本。我们可以用console.table打印一下demo中的diffs:
  • diff_cleanupSemantic:处理文本差异,增加文本差异的可读性。
  • diff_cleanupEfficiency:也是处理文本差异,对比上面的方法它偏向于更快的处理速度,不会优先考虑可读性。上面提到的官网demo三种处理方式就是采用了不同的方法。
  • diff_levenshtein:表示差异文本的长度。上面demo中有一处差异就是456,很明显该方法返回的值就是3。
  • diff_prettyHtml:将差异文本处理成html格式。该方法主要用于展示,对展示没有特别要求我们直接用该方法即可,非常简单。
    剩下的就是match与patch的API,这里就不再赘述,看官方文档就行。下面我们就来研究一下diff_prettyHtml方法,了解原理,这样我们就能自定义样式满足各种展示需求。源码的js是压缩过后的,可读性差我们看下java写法,思路上是一样的。
  1. 利用for循环diffs数组,利用replace将特殊字符进行转义。

  2. 通过switch、case处理文本差异,operation是枚举,刚好返回的diffs中-1、0、1相对应: INSERT------1:表示插入,用ins标签包裹文本

    DELETE------1:表示删除,用del标签包裹

    EQUAL------0:表示相等,用span标签包裹。

源码很简单,就是将文本转义然后根据文本性质用不同的标签包裹,其中ins表示插入文本标签,del表示删除标签,我们通过修改append里面的内容就能自定义展示样式。

总结

以上就是通过dmp第三方库完成文本对比需求的过程,很简单,而且我们还能根据需求自定义展示效果。

相关推荐
adminIvan1 分钟前
Element plus使用menu时候如何在折叠时候隐藏掉组件自带的小箭头
前端·javascript·vue.js
会发光的猪。20 分钟前
【 ElementUI 组件Steps 步骤条使用新手详细教程】
前端·javascript·vue.js·elementui·前端框架
我家媳妇儿萌哒哒21 分钟前
el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现
前端·javascript·elementui
baiduguoyun36 分钟前
react的import 导入语句中的特殊符号
前端·react.js
前端青山38 分钟前
webpack指南
开发语言·前端·javascript·webpack·前端框架
NiNg_1_2341 小时前
ECharts实现数据可视化入门详解
前端·信息可视化·echarts
励志前端小黑哥2 小时前
有了Miniconda,再也不用担心nodejs、python、go的版本问题了
前端·python
喵叔哟2 小时前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特2 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解2 小时前
【深度解析】CSS工程化全攻略(1)
前端·css