热搜:前端 nest neovim nvim

vue模版解析正则使用就html模版前标签处理

lxf2023-06-14 03:58:50

持续创作,加速成长!这是我参与「编程 · 10 月更文挑战」的第21天,点击查看活动详情

我们在文章 模版转成AST树的逻辑上的匹配过程介绍一个匹配的过程逻辑,这篇介绍一下细节,主要是怎么用用正则进行匹配,正则的表达式咱们主要是在vue2的源码的,需要自己复制一下,就不自己写了,咱们来看下位置吧 github.com/vuejs/vue/b… 我们用的就是这个位置的正则 看一下每个正则可以匹配什么,下面是我们这次用到的正则,

// 正则匹配标签 
// 可以匹配id = “app” id = 'app' id = app
const attribute =
  /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
// 匹配标签名 my-header 自定义标签
const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z]*`
// 匹配特殊的 my:header 这种标签
const qnameCapture = `((?:${ncname}\\:)?${ncname})`
//<匹配div
const startTagOpen = new RegExp(`^<${qnameCapture}`)
// > />
const startTagClose = /^\s*(\/?)>/
// 匹配</div>
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`)

我们拿到了这个正则,就可以对模版字符串进行处理了,方式在上一篇文章也说了,就是进行while循环,咱们来看看循环里的具体逻辑

function paresHtmlToAst(html) {
  while(html){ // 使用了while循环
     // 首先需要判断是不是开始标签
     let textEnd = html.indexOf('<') // 尖括号找到了说明时第一项,没找到说明不是
      if (textEnd==0) {// 找到了
        // 交给开始函数去做
        const startTagMatch = parseStartTag()
     }
  }
  function parseStartTag() { // 这个函数树主要做开始标签处理的,
      const start = html.match(startTagOpen) // 这里我们就用到了startTagOpen的这个正则,他是专门为找开始标签使用的 
      //咱们log就是下面截图,我们看到的具体信息
      // 我们拿到信息之后首先要生成一个tagname 后面做AST树要用这个数据
      if (start) {
          const match = {
            tagName: start[1],
            attrs: [],
          }
          // 对html进行切割
          advance(start[0].length)
      }    
  }
  
   // 截取字符串方法
  function advance(n) {
    html = html.substring(n)
  }
}

vue模版解析正则使用就html模版前标签处理

被切割后的模板图片

vue模版解析正则使用就html模版前标签处理 第一步切割已经完成了 后面继续

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!