正则
首先看一下其中的正则表达:
fragmentRE = /^\s*<(\w+|!)[^>]*>/,
singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
rootNodeRE = /^(?:body|html)$/i,
capitalRE = /([A-Z])/g,
JavaScript的正则表达式要包含在/ /
中间。后面可以跟g
,i
来表示是否进行全局匹配或者不区分大小写匹配。
fragmentRE = /^\s*<(\w+|!)[^>]*>/
-
^
从句首开始匹配 -
\s
是一个metacharacter
,匹配一个空白字符,包括space, tab, carriage return。 后面跟着*
,表示可以匹配0个或0个以上空白字符 -
<
匹配一个<
-
(\w+|!)
,\w
是一个metacharacter
, 匹配0-9a-zA-Z_
, 注意其中包括下划线.\w+
表示匹配一个或者一个以上该字符.|
表示或者.!
匹配!
. 括号的作用是用于捕获(capture), 在匹配文本时,可以输出相对应的字符(characters). -
[^>]
^
在句首表示从开始匹配, 在[]
这个class中表示 非 的意思, 而且[]
只能表示一个字符。 所以这个表达式的意思是 匹配一个不是>
的字符.后面跟着*
,表示匹配0个或者0个以上不是>
的字符 -
>
匹配一个>
.
singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/
-
^
匹配句首 -
<
匹配<
-
(\w+)
匹配一个或者多个0-9a-zA-Z_
的字符, 并且catpure. -
\s*
匹配0个或0个以上空白字符 -
\/?
匹配0个或1个/
, 其中\
为escape -
>
匹配>
-
(?:<\/\1|)
,?:
表示不capture, 我用这个括号就是想为了把他圈起来. 后面的\1
是一块的,表示把第一个捕获的内容插入到这来,在这个例子中也就是\w+
所以,它完全可以写成(?:>\/\w+|)
.|
表示或者,它后面什么都没有,那么这个表达式的意思就是要么匹配\/\w+
要么啥也不用匹配. -
$
匹配句尾,如果要匹配的文本超出了前面可以匹配的长度,那这个文本整体就不匹配该表达式
所以这个表达式可以匹配<br>
, <br />
, <h3></h3>
. 最后一种情况只捕获<h3>
tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
-
(?!exp)
零宽度负预测先行断言(zero-width negative lookahead assertion), 匹配后面跟的不是exp的位置. 比如\d{3}(?!\d)
匹配三位数字,而且这三位数字后面不能是数字.
同理这个表达式匹配<
, 但是<
后面不能跟area, br 等等. -
(([\w:]+)[^>]*)
作为一个整体来看是一个caputring group. 然后里面有一个小的capturing group 2, 可以匹配\w
或者:
并且可以重复1到无限次. 后面可以跟着不是>
的任意次字符 -
\/>
匹配/>
所以这个表达式可以匹配<abc:sfsf/> 之类的文本,但是不能匹配<img/>
rootNodeRE = /^(?:body|html)$/i,
这个应该没什么好解释的的了,要么匹配body
,要么匹配html
,不区分大小写
capitalRE = /([A-Z])/g,
匹配大写字母
通读源码
isArray = Array.isArray ||
function(object){ return object instanceof Array }
用于判断对象是否是array, MDN的推荐做法是
if (!Array.isArray) {
Array.isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
}
这里面使用Object.prototype.toString()
来判断参数的类型
总结
用toString
来detect object class. 注意isArray
的polyfill.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。