最近实现的一个分离文章内容功能,挺有意思,分享一下

林冠宏/指尖下的幽灵--现主要研发区块链应用:交易所,钱包, 林冠宏/指尖下的幽灵--现主要研发区块链应用:交易所,钱包,DApp等     2022-10-01     112

关键词:

这个功能的描述是:

把一本符合markdown语法写的书里面的所有大章节里面内容的每个大标题和该标题对应下的内容做分离,一 一对应。

一般会出现这种问题的场景:

  • 笔试算法题
  • 产品需求

举个例子,有一段内容是如下:

### 糖尿病的症状 (这是 markdown 的第三级标题)
初期的症状体现在.....

分离后要求达到:

title   ===> 糖尿病的症状
content ===> 初期的症状体现在...

对我而言,这个功能的目的是:

我们把一本书分割成上述的样子,数据存入数据库。供搜索使用。搜索方式,以 title 或 content 做模糊匹配,命中即返回。

相信看到这里的读者都能清楚知道上面谈的是什么,但愿我的文字能通俗易懂,文字多了,我也记不住,累赘。

实现思路:

  • 正则匹配 ------------- ①
  • 逐行处理 ------------- ②

先谈谈正则匹配下的处理:

  • 优点
    • 写好匹配式,其它交给 API,方便
  • 缺点
    • 难度大,上述问题的内容掺杂情况有很多种

然后是逐行处理处理:

  • 优点
    • 逻辑可控,可丰富自定义处理,例如过滤和二重分割,属于完整的字符串操作
    • 代码清晰,速度快一些
  • 缺点
    • 消耗内存多一些

两种方法的对比:

  • 效率,平分
  • 可读性,② > ①
  • 整体内存占比,② > ①

举个例子对比:

标题有下面的 markdown 代码形式:
###   第一种标题
####  第二种
##### 第三种[点我](http://www.xxx.com)
### ``第四种``
### <strong>第五种,嵌套html标签</strong>
...
采用正则表达式处理的时候

对于上面的情况,第一次的正则拿出标题内容很简单,例如这个: ###? 从三个#号开始贪婪匹配。这样我们可以拿出标题,但是标题里面还掺杂着一些其他标签。你会想,有没有可能在正则匹配就把掺杂的标签去掉。那这个是肯定可以的,代价就是高超的正则匹配式子,且现在还没考虑内容的情况。

为什么非要去掉标签呢? 因为这是标题,标题将会被用作搜索的 key,且返回给前端的时候,你不能把这个解析符号也给前端对吧?去掉了有以下好处:

  • 减少搜索的 o(n)
  • 方便显示
采用逐行处理的时候

我们从文件中读出第一行 ### 第一种标题,replace 函数处理掉 ### 等符号,这里循环处理即可去掉指定的任何符号。
读出第三行的时候 ##### 第三种[点我](http://www.xxx.com),处理掉,##### [ ] ( 等,剩下就是完美:第三种点我

看到这,你是否觉得事情变简单了?

我们知道 markdown 的非标题内容部分,符号和标签更是多种多样,如果我们用正则解决,假设标题能完美处理,那么内容怎么办呢? > 如果去掉内容的其他无用标签,或者要求特定保存一些,等情况,多批次的正则过滤将会是花销巨大的操作。

解决流程:

无论是正则匹配方案 还是 逐行处理方案,这两种我都写了对应的引擎函数,通过且以后者运行谓之 0 bug。实现的时间加起来不足 3.5 小时。后者尤其快,下面我仅主要介绍后者的解决流程

先明确几个细节点
  • 只有标题没对应内容,自动补充为空字符串
  • 只有内容没对应标题,不录入
例如
内容66655
####  标题一
####  标题二
456789....

输出:

title[0] ===> "标题一" , content[0] ===> ""
title[0] ===> "标题二" , content[0] ===> "456789...."

流程图

至此,已经很简答,例如 Java 语言的 String API startWith 就能用在判断是否是titleif(startWith"####")
过滤方面,replace 之类的函数,等都可以。公司代码,不便公开。

我们为什么要尝试前后端分离(代码片段)

...离的主要概念就是:后台只需提供API接口,前端调用AJAX实现数据呈现。 现状与分歧作为一名前端开发人员,我们应该尝试一些新颖的技术,完善每一个细节性的问题,不断突破自我。虽然前后端分离已经算不上什么新颖的... 查看详情

dede文章页怎么实现tab功能。如分成三个tab--产品参数,产品功能,配件三个tab,点哪一个显示哪个一个。

...义模型了。追问请问有没有现在的模板或代码给我参考?实现以上切换效果即可。追答不好意思,还真没有。这个TAB效果的前台的CSS与JS需要你自己网上找或者自己写,然而后台就需要自定义模型来实现。核心->频道模型->内... 查看详情

运用nodejs实现音乐播放器

...:运用nodejs实现音乐播放器最近在学习nodejs,感觉这个挺有意思的,并且还能做爬虫,于是,有了一个想法,那就是运用nodejs下的相关模块访问kg音乐的相关链接,获取这些链接的相关数据,从而也做一个音乐播放器试试。注意... 查看详情

运用nodejs实现音乐播放器

...:运用nodejs实现音乐播放器最近在学习nodejs,感觉这个挺有意思的,并且还能做爬虫,于是,有了一个想法,那就是运用nodejs下的相关模块访问kg音乐的相关链接,获取这些链接的相关数据,从而也做一个音乐播放器试试。注意... 查看详情

wpf实现新手提示功能(代码片段)

...显示不同提示气泡的样式。这里就分享一下在WPF中如何去实现,我们先看下面的效果。文章中只出现了部分关键代码全部代码在,源码地址在Github上。 https://github.com/JusterZhu/2021PlanJ二、思路通过上图显示的内容我做了以下 查看详情

记事本代码

...麻烦的,本来开始想完全自己写,结果由于开始有些功能实现起来没什么头绪,诸如撤销等功能不知道如何实现,然后就在网上找了几篇文章看看怎么实现,结果看到一篇写的相当不错的,然后把他的一些类和函数都给看了一遍... 查看详情

免费分享一个springboot+vue校园宿舍管理系统,挺漂亮的(代码片段)

...管理系统,分享下哈。项目预览  项目介绍功能主要实现校园宿舍的宿舍管理,学生管理,班级管理,宿舍楼管理,以及维修记录管理,晚归管理,请假管理。同时有一套系统管理,包含用户管 查看详情

想实现一个类似于收趣app的功能,求助

  近日想做一个类似于收趣APP软件的一个功能,将头条、微信等其他App的文章能够分享到自己的平台软件中。  分享的方式有三种:  1.通过微信好友的方式,将文章分享给收趣。  2.复制文章链接,然后打开收趣App后... 查看详情

vuejs模仿实现一个电影分享类网站

前几天朋友发了一个电影分享类网站:http://dy.bingthink.top/感觉界面还挺好看的,所以打算用vuejs模仿写一个。从后台转前端,要学习的东西挺多的,仅以此记录我的学习历程,闲的无聊,对各个技术做了一下了解,php的确是不错的... 查看详情

针对结构映射的svm算法:核心思路解读

...,在和同学们读相关文章。今天有个同学找到了个挺有意思的文章,用SVM做NER的。我感觉这想法挺奇特的,SVM怎么处理文本和序列?于是我去看了一下,他找的那篇文章是个套壳文章,核心算法引用了一篇... 查看详情

运用html+css+javascript实现扫雷游戏

...雷游戏最近玩了一个小游戏扫雷,玩着玩着觉得这游戏挺有意思的,不如自己做一个出来,这样既可以让我更加了解扫雷这个游戏,同时也能敲敲代码,提高自己写代码的速度,哈哈!不过,通过做这个扫雷游戏,我也感觉又复... 查看详情

运用html+css+javascript实现扫雷游戏

...雷游戏最近玩了一个小游戏扫雷,玩着玩着觉得这游戏挺有意思的,不如自己做一个出来,这样既可以让我更加了解扫雷这个游戏,同时也能敲敲代码,提高自己写代码的速度,哈哈!不过,通过做这个扫雷游戏,我也感觉又复... 查看详情

百万级数据excel导出功能如何实现?(代码片段)

...的excel导出功能,已经正常上线使用了。这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助。原始需求:用户在UI界面上点击全部导出按钮,就能导出... 查看详情

java实现返回一个字符串所有排列

今天偶然看到了一个笔试题,觉得挺有意思,分享一下解题思路publicvoidpermute(Stringstring);publicvoidpermute(char[]chars,intlow,inthigh);第一个方法是驱动程序,它调用第二个方法并打印给定字符串的所有序列如果给定字符换"abc"则相继打印... 查看详情

源码分享poscms功能如何实现短信验证码

对接短信的时候发现一家短信公司,有些不错的短信验证码的插件,对接起来挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件说明本插件系互亿无线针对POSCMSV3.2.0短信插件开发,插件内的所有文件均为对原文件的修改,如... 查看详情

python一个函数让你决定你的二维码(代码片段)

...浏览网页时无意中看到了一个特别有趣的二维码,感觉挺有意思的,回来后自己查了一下,发现挺简单的,就分享一下,挺有意思的。该函数的主要流程就是MyQR库中的myqr.run()函数,将连接转化为二维码,然后将二维码和你自己... 查看详情

免费分享一个springboot+vue学生选课管理系统,挺漂亮的(代码片段)

大家好,我是锋哥,看到一个不错的springboot+vue前后端分离的学生选课管理系统,分享下哈。项目介绍这是一个采用前后端分离开发的项目,前端采用Vue开发、后端采用SpringBoot+Mybatis开发。项目部署1.将student... 查看详情

测试人员需要了解一下开发人员一直在讲的前后端分离

最近做的一个前后端分离的项目,来了补充一下前后端分离的知识点,发现这篇文章特别好,收藏起来,这篇文章有点长,哈哈作者:偏头痛杨来源:https://blog.csdn.net/piantoutongyang一、前戏前后端分离已成为互联网项目开发的业界... 查看详情