当前位置: 首页 > 后端技术 > Node.js

正则表达式解析Markdown语法

时间:2023-04-03 19:45:14 Node.js

转载请注明出处链接http://blog.huanghanlian.com/article/5c80b4176f8b011040530140文章来源于本博客开发实现需要截取首页列表中的文字,首发需要截取一个Markdown语法的图片url。在文章详情页和关于文章展示的页面。文章内容需要截取。填写头部描述。有利于SEO优化Markdown是一种可以用普通文本编辑器编写的标记语言。通过简单的标记语法,可以使普通的文本内容具有一定的格式。真实场景和功能需求文章写作文章列表预览头部描述截取需要做的是通过文章Markdown语法的字符串来过滤具体的句子。只显示文章的文字部分,实现场景文章以字符串类型写入并存入数据库。当访问一篇文章时,后台会去数据库中取相应的文章数据。然后通过匹配将Markdown语法的字符串转义为html元素字符并渲染输出'#一级标题\r\n##二级标题\r\n#####五级标题\r\n-列表编号第一项\r\n-列表中的第二项\r\n1。有序列表中的第一项\r\n2。有序列表中的第二项\r\n[标题](链接地址)\r\n![图片描述](图片链接地址)\r\n*斜体*\r\n**加粗**\r\n>引用段落\r\n```\r\n代码块\r\n```'我们现在要做的是去除不需要的字符,提取内容部分的正则表达式规则。在使用正则表达式解析Markdown语法之前,我们首先要对正则表达式的规则有一个基本的了解。下面我整理了一张正则表达式语法对照表。正则表达式预定义类:字符含义。除回车换行外的所有字符相当于1d个数字字符,相当于[0-9]digitD个非数字字符,相当于2s个空白字符,相当于[tnx0Bfr]空格S个非空白字符,相当于3w个单词字符(字母、数字、下划线),相当于[a-zA-Z_0-9]wordW非单词字符,相当于4个边界字符含义^以xxx开头$以xxx结束b单词边界B非单词边界量词字符含义?零次或一次出现(至多一次出现)+一次或多次出现(至少一次出现)*零次或多次出现(任意数量){n}n次出现{n,m}n到m次出现{n,}出现在leastntimeswithregularexpressionsParsingMarkdownsyntaxMarkdown语法包括标题、图片、链接、引用块、列表、粗体、斜体等,下面是正则表达式和解析这些语法的简要说明:以“#”开头的多个字符串,“#”后有0个或多个字符,如:“###三级标题”)。^(#+)(.*)链接(Markdown语法中链接的表示法是[link](URL).)。/\[[\s\S]*?\]\([\s\S]*?\)/g解释:匹配[字符,然后匹配[sS]范围,可以为空或非空。*代表0次还是无限次出现?非贪婪模式让正则表达式尽可能少地匹配,也就是说,一旦匹配成功,就不再继续尝试,这就是非贪婪模式。方法很简单,加?在量词之后。斜体(表示以*或_开头和结尾的字符串(\1表示与第一组规则相同),中间包含0个或多个字符)。(\\*|_)(.*?)\\1图片(部分与链接相同)!\\[[^\\]]+\\]\\([^\\)]+\\)ColdFont(同斜体)(\\*\\*|__)(.*?)\\1strikethrough(删除线)\\~\\~(.*?)\\~\\~参考块\n(>|\\>)(.*)内联代码块`{1,2}[^`](.*?)`{1,2}分割线^-+$`封闭代码块```([\\s\\S]*?)```[\\s]?无序列表^[\\s]*[-\\*\\+]+(.*)有序列表^[\\s]*[0-9]+\\.(.*)functionabstractFn(res){如果(!res){返回'';}else{varstr=res.replace(/(\*\*|__)(.*?)(\*\*|__)/g,'')//全局匹配中加粗.replace(/\!\[[\s\S]*?\]\([\s\S]*?\)/g,'')//全局匹配image.replace(/\[[\s\S]*?\]\([\s\S]*?\)/g,'')//全局匹配connection.replace(/<\/?.+?\/?>/g,'')//全局匹配htmltags.replace(/(\*)(.*?)(\*)/g,'')//全局匹配内联代码block.replace(/`{1,2}[^`](.*?)`{1,2}/g,'')//全局匹配内联代码块.replace(/```([\s\S]*?)```[\s]*/g,'')//全局匹配代码blocks.replace(/\~\~(.*?)\~\~/g,'')//全局匹配删除线.replace(/[\s]*[-\*\+]+(.*)/g,'')//全局匹配无序list.replace(/[\s]*[0-9]+\.(.*)/g,'')//全局匹配有序list.replace(/(#+)(.*)/g,'')//全局匹配title.replace(/(>+)(.*)/g,'')//全局匹配summary.replace(/\r\n/g,"")//全局匹配newline.replace(/\n/g,"")//全局匹配newline.replace(/\s/g,"")//全局匹配空字符;返回str.slice(0,155);}}rn?0-9?tbx0Bfr?a-zA-Z_0-9?