范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

从零实现一个简单的HTML语法树要多久?

  前言
  如果您以前问我这个问题,我会说,肯定很难吧,我们用用开源项目 就好。
  何必重复造轮子 ?
  应不应该重复造轮子 呢?
  我想每个人心中都有答案。但是我鼓励大家,我们一起重复造轮子 。
  后续会出一篇文章,关于Chat 的文章。是的,不是ChatGPT ,是Chat ,没有机器学习,我们普通研发人员,也应该继续前进,当然还是和正则表达式 有关系。
  现在,我们回到今天的话题,正则表达式实例与HTML语法树。
  前面的文章,我们知道了,怎么匹配HTML标签,怎么匹配HTML标签属性,今天我们从零实现一个HTML语法树。
  看这篇文章之前,建议先看前面两篇文章,如果您对正则非常熟悉,那么现在就开始吧。1、收集需求
  在开始前,我们需要整理需求,我们需要知道,一个完整的HTML文档,最基本的语法,标签以及不同框架增加的特殊属性 等,我们因该如何去匹配实现。
  为什么要加上其它框架属性,因为当时想通过一套代码生成VUE、React版本。 [我想静静]
  下面截图文档中,基本囊括了,一个HTML文档的所有情况信息,您可以仔细看下。其中包括(注释、文档声明、单标签、双标签、样式、脚本、有属性值属性、属性名即属性值属性、第三方框架属性等)。
  需求文档图
  2、整理需求2.1、匹配注释
  const reg_comment = /<!--.*?-->/s;2.2、匹配文档声明
  const reg_doctype = /]*>/i;2.3、匹配开始标签及单标签
  const reg_element = /<[^/!](([""])+.*?2|[^>])+>/2.4、匹配结束标签
  const reg_elementEnd = /</.*?>/2.5、匹配标签名称
  <p>p>var reg_tagName = /(?<=<[/s]*)w+(?=(s+(?![s=])|>))/;2.6、匹配所有属性
  type="text" disabled  value=""  class="txt txt-md"  v-on:click="save("button")"  />const reg_tagAttrs = /(?<=s)[w:.-@]+(=([""]).*?2)*/g;2.7、匹配属性名称及属性值
  v-on:click ="save("button") "var reg_tagAttrDatas = /(^[^=]+|(?<=([""])).*?(?=2))/g;
  3、技术方案3.1、直接使用正则表达嵌套匹配,然后无限递归。
  查阅了相关资料、同时编写Demo案例验证、对于Javascript版本的正则表达式,发现对于嵌套匹配目前支持不完善,所以放弃这种方式。
  当然,也有可能,我挖掘的还不够深入。3.2、直接逐句匹配,然后无限递归。
  怎么理解?
  请看下面的例子。
  沧海一站
  
  
  看到这个例子,你大概明白。就是一行一行的匹配,或者说每次只匹配一种类型。
  1、遇到非 input、img、link、hr、br这几个单行标签,或者结束标记,就向下递归。
  2、遇到 结束标记,就返回上一层。
  3、遇到 style、script标签,他们内部的内容,直接按文本处理。
  到这,我想部分朋友,都不需要看代码实例,都知道怎么实现了。4、主要需求实现
  测试代码从PrvtCMS中,临时拆分出来的,只要思路有了,实现起来还是很容易。const reg_tagName = /(?<=<[/s]*)w+(?=(s+(?![s=])|>))/; const reg_tagAttrs = /(?<=s)[w:.-@]+(=([""]).*?2)*/g; const reg_tagAttrDatas = /(^[^=]+|(?<=([""])).*?(?=2))/g; const regMap = new Map(); regMap.set("element", /^<[^/!](([""])+.*?2|[^>])+>/); regMap.set("elementEnd", /</.*?>/); regMap.set("note", /<!--.*?-->/is); regMap.set("declare", //i); regMap.set("text", /^[^<>]+/);/**  * 返回Json语法树  * @param {父节点名称} name  * @param {被解析的html} htmlContent  * @param {节点集合} nodes  */ const toJson = (name, htmlContent, nodes) => {   regMap.forEach((value, key) => {     if (key !== "elementEnd") {       let res = regFirstResult(value, htmlContent);       if (res.length) {         htmlContent = toNext(name, res, key, htmlContent, nodes);       }     }   });   // 处理同级   let res = regFirstResult(regMap.get("element"), htmlContent);   if (res.length) return toJson(name, htmlContent, nodes);   return htmlContent; };  /**  * 下一匹配  * @param {父节点名称} name  * @param {匹配结果} parseRes  * @param {匹配类型} nodeType  * @param {被解析的html} htmlContent  * @param {节点集合} nodes  * @returns  */ const toNext = (name, parseRes, nodeType, htmlContent, nodes) => {   if (nodeType == "elementEnd")     return parseElementEnd(name, parseRes, nodeType, htmlContent, nodes);   if (nodeType == "element")     return parseElement(name, parseRes, nodeType, htmlContent, nodes);   return parseText(name, parseRes, nodeType, htmlContent, nodes); };  const nodes = []; toJson("", strHtml, nodes); console.log(JSON.stringify(nodes));
  结果图
  实际应用案例探讨
  了解或者使用Svelte、Angular、Vue、React、 Htmx、Qwik、Astro、 Web Component等等技术, AST似乎无处不在 。
  所以一起重复造轮子吧。
  PrvtCMS模板在线管理、支持实时预览、跨模板、跨组件引用等。能实现这些功能的基础就是写了一个HTML语法树。是的,重复造轮子。
  功能截图
  ……思考中……
  人人为我,我为人人,欢迎您的浏览,我们一起加油吧。

旗舰回归!华为5G麒麟手机重新上架临近双11,各个手机厂商陆续开始降价促销,相较之下华为似乎没有什么动作,但实际还是有的。10月21日,有网友发现华为在京东的自营旗舰店上架了两款搭载麒麟芯片的5G手机,分别是华为M2030年我国化工产值将占全球半壁江山中国工业报记者孟凡君我国石化产业自2010年高居世界石化产业第二和世界化工产业之首,2030年我国化工产值将占全球半壁江山。我国是石油和天然气消费大国,党的十八大以来,我国立足石化中科院团队研发化石三维建模可视化专用软件面向全球免费共享Vayu软件主界面与部分案例展示。中科院古脊椎所供图中新网北京10月21日电(记者孙自法)如何让古生物学领域对古老化石的研究更具活力?如何让化石与现代生物的形态和解剖学可视化效果更全球智能手机市场Q3出货量出炉,同比下跌9受全球范围新冠疫情经济局势不明朗等影响,2022的手机市场一再萎缩不是秘密。而在近日市场调研机构Canalys也发布了2022年第三季度全球智能手机市场出货量的相关报告。根据该市场湖南94岁老兵隐居美国15年,身份意外曝光后,美国总统亲自致谢1992年4月11日,正在访美的撒切尔夫人在繁忙的国事访问中特意抽出身来,专程赶到了美国芝加哥市。撒切尔到达芝加哥以后,马不停蹄地赶赴卡尔登酒店,今天她要见一位非常重要的英雄人物。欧阳修被绯闻击垮的一代精神领袖在历史与现实中,打击对手最好用也最阴险的一个手段,就是制造并传播绯闻。01hr1067年,61岁的欧阳修,遭遇了一生中最大的绯闻。御史蒋之奇上疏,揭发欧阳修与儿媳吴氏有染。欧阳修身TCL智屏前三季度全球销量超过1600万台10月21日,TCL电子控股有限公司公布2022年前三季度全球销量数据。2022年前三季度,TCL智屏全球销量达到1662万台。其中,第三季度销量达到647万台,同比增长11。8。50年前,因为美国运动员因为打错了车,促成了中美建交蝴蝶效应,往往指代一个不经意间的微小举动,所引起的巨大改变,而发生在1971年的一个偶然事件,便正是蝴蝶效应这一理论,对现实造成巨大影响的一次经典案例,在这个案例中,正是因为我们向美国航天局公布天体景象创生之柱新图像由于老鹰星云中其他恒星在手指状气体柱上造成的腐蚀,使它们形成了手指之外的蛋型。每一个蛋都被与我们的太阳系一样尺度的气体环绕着,并且有一颗新生的恒星在其中。这张由32张不同影像合成的A股如果多头反击失败,15年大跌的历史很可能会重现昨天的时候就说过了,今天是反击的好时机,如果今天多头都不能放大招,那么股市可能面临非常危险的情况,而前面说过,最近的走势和年的时候比较相似,如果多头此时不给力,那么15年的历史很可45岁特殊工种退休,有这个养老金水平,很满足2022年4月份,张女士只有45岁,却可以办理退休了,为什么?因为张女士是特殊工种办理退休,具体哪些工种可以提前办理退休,大家可以自行去百度查阅。别看张女士只有45岁,但是张女士的
佛山这有浪漫名字的古村,遇一树成林榕树,为何称国事榕如果你是爱生活爱旅行爱摄影爱美食,跟珊珊三丫头一起出发吧!榕树,是南方城市和乡村中常见的树,许多人对其是充满情怀,在没有手机和电脑的年代,记忆中总能找到一段与榕树有关的经历与童年小江都在泰州引江河东岸的两块地2019年江苏省政府同意将扬州市江都区浦头镇引江新村东野永兴2个村民小组划入泰州市海陵区行政区域,由泰州市海陵区寺巷街道大王居委会管理。许多人以为引江河东岸再没有江都的土地了,然而我第三次回介休老营房我和老伴带小外孙在炮212团原办公楼前转眼到了2017年7月,11岁的小外孙放了暑假,正是长身体学知识的时候,我与老伴就陪着他先是到河南洛阳看龙门石窟关林,到陕西西安看西安事变五间巩义的十大古寨河洛文化郑州头条头条创作挑战赛清代中后期,外国入侵,爆发了太平天国农民起义,为抵抗太平军北伐西征,清政府及地方官吏强令民众修建了许多寨堡民国时期,军阀混战,特别是抗日战争爆发后,巩在新疆开民宿怎么样?我们和8位主理人聊了聊近年来,中国民宿行业迅速扩张,民宿数量持续增长,西北地区增速尤其明显。2021年中国民宿数量增长的TOP2的省份就是新疆,增幅高达144。4。图源迈点研究院实际在新疆开民宿怎么样?郭虾蟆城大金王朝的句号郭虾蟆城是一处鲜为人知的地方。郭虾蟆城是我们身边的古战场。郭虾蟆城是大金王朝的句号。郭蛤蟆城遗址是祖厉河东岸的一片残垣断壁,位于会宁县郭城驿镇新堡子村西侧。郭虾蟆城古称会川城,兴建海南行之海口我在海口吃早茶去海南是想了很久的事情,正好女儿放假在家,也正好还没到大批学生放假,所以带着女儿就出发了。我的第一站就是海口,当然因为它是省会,也因为它的低调,它不像三亚那般热闹,也国庆自驾之旅河南漯河市临颍县小商桥(Day7,10月7日)驱车赶到小商桥的时候已经是10月7日傍晚17点20分了。在我的想象中,小商桥也就是路边的一座野桥,顶多边上立一座文保碑而已。等我们到了才发现,围绕着小商桥居然建立了一个景区。景区位西行漫记老娘今年身体大不如前,失眠,腰腿疼,都是没法治疗的老年病,除了去医院各种检查,我更多的想着怎么让她快乐的度过每一天,所以就想着和兄弟姊妹一起陪着去一趟新疆。出发的前一天晚上,姐还在又到丽江杀猪季!有老板全体放假去吃杀猪饭如果你问云南的吃货们最喜欢的季节那很多人会毫不犹豫地回答说是夏天因为夏天有令人为之痴醉的鲜美野生菌但是对于大多数丽江吃货来说冬天才是最有口福的季节因为入冬就意味着到了丽江人一年一度泰姬陵为什么是世界奇观?印度的泰姬陵(波斯语意为宫殿之冠)是一个印度伊斯兰建筑,可以追溯到17世纪。这座大理石陵墓位于印度阿格拉市的亚穆纳河畔,是世界上最受欢迎的旅游胜地之一。泰姬陵进入了现代世界七大奇迹