目录版本 环境搭建新建vue 增加ArcGIS JavaScript 包引用 拷贝资源信息页面测试版本 Vue 2 ArcGIS JavaScript 4.22 注意 ArcGIS JavaScrip
顺晟科技
2021-07-05 10:36:21
202
Vue parseHTML 中所用的所有正则如下。常见正则规则可参见附录 1,Vue parseHTML 正则所用规则均可在其中找到定义。
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z${unicodeRegExp.source}]*`
const qnameCapture = `((?:${ncname}\\:)?${ncname})`
const startTagOpen = new RegExp(`^<${qnameCapture}`)
const startTagClose = /^\s*(\/?)>/
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`)
const doctype = /^<!DOCTYPE [^>]+>/i
const comment = /^<!\--/
const conditionalComment = /^<!\[/
接下来一个个分析上述正则表达式。
const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
分析其结构:
^\s*
匹配 0 至多个以空白字符开头的字符串空白字符的部分
捕获组:([^\s"'<>\/=]+)
匹配并捕获 1 至多次除 空白字符
"
'
<
>
/
=
以外的所有字符
非捕获组:(?:\s(=)\s(?:"(["]*)"+|'([']*)'+|([^\s"'=<>`]+)))?
\s*
匹配 0 至多个空白字符(=)
匹配并捕获 =
\s*
匹配 0 至多个空白字符(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>\
]+))`
"([^"]*)"+
"
匹配 "
([^"]*)
匹配并捕获 0 至多个除 "
外的字符"+
匹配 1 至多次 "
'([^']*)'+
'
匹配 '
([^']*)
匹配并捕获 0至多个除 '
外的字符'+
匹配 1 至多次 '
空白字符
"
'
=
<
>
` 外的字符?
匹配 3 中非捕获组 0 次或 1 次attribute 表达式匹配的是:
以 0 至多个空白字符开头;
紧接着 1 至多个除 空白字符
"
'
<
>
/
=
以外的字符;
紧接着 0 至多个空白字符;
紧接着 =
;
紧接着 0 至多个空白字符;
紧接着匹配 0 次或 1 次:
(1) "
+ 0 至多个除 "
外的字符 + "
;
(2) 或 '
+ 0 至多个除 '
外的字符 + '
;
(3) 或 1 至多次除 空白字符
"
'
=
<
>
` 外的字符
例如:
<div id="mydiv" class="myClass" style="color: #ff0000" >
在 Vue 的 parseHTML 时,就能将 id="mydiv"
、class="myClass"
、style="color: #ff0000"
提取出来。
const dynamicArgAttribute = /^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/
分析其结构:
^\s*
匹配以 0 至多个空白字符开头
捕获组:((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)
非捕获组:(?:v-[\w-]+:|@|:|#)
匹配:
(1)v-
+ 1 次或多次包括下划线在内的任意单词字符 + :
(2)或 @
(3)或 :
(4)或 #
\[[^=]+\]
匹配 以 [
+ 1 次或多次除 =
外的所有字符 + ]
[^\s"'<>\/=]*
匹配 0 次或多次除 空白字符
、"
、'
、<
、>
、/
、=
以外的字符
已在 attribute
章节分析过。
dynamicArgAttribute 用于匹配:
以 0 至多个空白字符开头
紧接着:
(1)v-
+ 1 次或多次包括下划线在内的任意单词字符 + :
;
(2)或 @
(3)或 :
(4)或 #
紧接着以 [
+ 1 次或多次除 =
外的所有字符 + ]
匹配 0 次或多次除 空白字符
、"
、'
、<
、>
、/
、=
以外的字符
紧接着 0 至多个空白字符;
紧接着 =
;
紧接着 0 至多个空白字符;
紧接着匹配 0 次或 1 次:
(1) "
+ 0 至多个除 "
外的字符 + "
;
(2) 或 '
+ 0 至多个除 '
外的字符 + '
;
(3) 或 1 至多次除 空白字符
"
'
=
<
>
` 外的字符
例如:
<a v-bind:[attributeName]="url"> ... </a>
<a v-on:[eventName]="doSomething"> ... </a>
在 Vue 的 parseHTML 时,就能将 v-bind:[attributeName]="url"
这种动态参数提取出来。
const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z${unicodeRegExp.source}]*`
首先看 unicodeRegExp
const unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/
定义了一系列合法字符,通过 Unicode 字符集范围匹配。
unicodeRegExp.source
用于拿到正则表达式 unicodeRegExp
的字符串。
ncname
即是一系列合法字符的集合。
const qnameCapture = `((?:${ncname}\\:)?${ncname})`
表示匹配 xxx:xxx
或 xxx
模式的字符。
const startTagOpen = new RegExp(`^<${qnameCapture}`)
startTagOpen
可匹配标签开始部分,即:<xxx:xxx
或 <xxx
的模式。
<xxx:xxx
代表的是带命名空间的 html 标签,文可参见这里,这种类型的标签主要作用是可以指定标签的命名空间,避免冲突。Vue 对这类的标签也做了解析。
如:<div
或 <math:div
const startTagClose = /^\s*(\/?)>/
^\s*(\/?)>
匹配以 0 至多个空白字符开头,接 0 或 1 个 /
,紧接 >
的字符串。
如: />
const endTag = new RegExp(`^<\\/${qnameCapture}[^>]*>`)
匹配以 </
开头,后接合法字符,后接 0 至多个除 >
以外的任何字符,最后接 >
。
如:</div>
const doctype = /^<!DOCTYPE [^>]+>/i
匹配以 <!DOCTYPE
开头,后接 1 至多次除 >
外的所有字符,后接 >
。注意该匹配模式不区分大小写。
如:<!DOCTYPE html>
const comment = /^<!\--/
匹配以 <!--
开头的字符串。
如:<!--STATUS OK-->
const conditionalComment = /^<!\[/
匹配以 <![
开头的字符串。条件注释主要用于做浏览器兼容等,文可参见这里
本文以 Vue 源码中 parseHTML 方法为例,分析了其中定义的正则表达式,将常见的正则规则做了梳理,同时可以备查 parseHTML 方法的正则规则,方便后续继续分析该方法。
* ? + . [ ] ( ) { } | ^ $,共 13 个。
09
2022-11
09
2022-11
09
2022-11
09
2022-11
19
2022-10
19
2022-10