系统标签解析原理

我们先看一个最简单的系统标签:{$Copyright},这个标签的作用是显示网站的版权信息,这个标签是如何解析的呢? 我们可以查找一下源代码(这里可以借助一些有查找功能的工具,比如说用DreavWeaver),可以发现在Include文件夹里面的PowerEasy.Common.Front.asp文件里面有这样一行代码(2657行左右): strHtml = PE_Replace(strHtml, "{$Copyright}", Copyright) 这行代码的作用就是将查找strHtml字符串的内容,然后将里面的{$Copyright}替换成Copyright这个变量的内容。 可能这里有人会有这样的疑问,strHtml是什么内容?Copyright这个变量的内容又是什么?可以这样理解,strHtml是一个字符串,字符串里面存放的是模板代码,Copyright是一个全站变量,他的内容对应网站的版权信息。 同理,我们可以增加一个最简单的系统标签,比如我们再这行代码下面加入: strHtml = PE_Replace(strHtml, "{$MyName}", "路人甲") 那么当你在模板里面插入{$MyName}这个标签时,解析的时候就可以解析成路人甲了。 接下来我们看看{$ShowLogo}这个标签是如何解析的,往下查我们可以看到2661行左右有这样的代码: If InStr(strHtml, "{$ShowLogo}") > 0 Then strHtml = Replace(strHtml, "{$ShowLogo}", GetLogo(180, 60)) 这里是先查找是否存在$ShowLogo}这个标签,存在的话将这个标签的内容替换成GetLogo(180, 60)这个函数的内容, GetLogo(180, 60)函数是定义在哪里的?我们同样可以查找一下,在这个文件的582行左右就可以找到这个函数的定义。 到这里,可能有人会有这样的疑问,如果我们要解析的系统标签是带参数的,那系统是如何解析的? 下面我们来看一下{$ShowLogo(width,height)}这个标签是如何解析的。 带参数的系统标签跟不带参数的系统标签解析方法是不同的,我们可以看一下以下一段代码 '替换Logo regEx.Pattern = "\{\$ShowLogo\((.*?)\)\}" Set Matches = regEx.Execute(strHtml) For Each Match In Matches arrTemp = Split(Match.SubMatches(0), ",") If UBound(arrTemp) <> 1 Then strLogo = "函数式标签:{$ShowLogo(参数列表)}的参数个数不对。请检查模板中的此标签。" Else strLogo = GetLogo(arrTemp(0), arrTemp(1)) End If strHtml = Replace(strHtml, Match.Value, strLogo) 这段代码就是查找系统函数标签的一个简单例子,我们逐句来解读一下: regEx.Pattern = "\{\$ShowLogo\((.*?)\)\}" 这个是一个正则表达式,由于在正则表达式里面{,$,(,),}都是特殊符号,要把他转换成普通字符处理,前面需要加上“\”,(.*?)表示匹配除换行符之外的字符,也就是说程序会查找{$ShowLogo(****)}这样的内容(***代表任何除换行符外的任何字符),如果有找到这个内容,那么程序就把它当成一个系统函数标签来处理。 Set Matches = regEx.Execute(strHtml) 这里执行模式匹配,也就是在查找模板中是否存在要查找的函数标签。 For Each Match In Matches 这里对匹配的结果进行处理 arrTemp = Split(Match.SubMatches(0), ",") Split函数的作用是分隔字符串,这段代码的作用就是对函数进行处理,用逗号来分隔,将分隔出来的存放在arrTemp数组中,也就是第一个参数存放在arrTemp(0)中,第二个参数存放在arrTemp(1)中,这样依次存放。 If UBound(arrTemp) <> 1 Then strLogo = "函数式标签:{$ShowLogo(参数列表)}的参数个数不对。请检查模板中的此标签。" Else strLogo = GetLogo(arrTemp(0), arrTemp(1)) End If If UBound(arrTemp) <> 1 Then这里是判断arrTemp这个数组有多少个数值,因为我们是从0开始计算的,第一个参数存放在arrTemp(0)中,所以这里的If UBound(arrTemp) <> 1 Then其实就是判断参数是不是2个(注意不是1个),不是的话就输出 strLogo = "函数式标签:{$ShowLogo(参数列表)}的参数个数不对。请检查模板中的此标签。" 如果参数是2个的话,就将这两个参数传递给GetLogo()这个函数,GetLogo()这个函数是带返回值的,strLogo = GetLogo(arrTemp(0), arrTemp(1))就是用strLogo这个变量来记录这个函数的执行结果。 strHtml = Replace(strHtml, Match.Value, strLogo) 这个代码就是用我们得到的结果来替换正则表达数找到的函数标签了,到此,这个系统标签的解析就算结束了。

你可能感兴趣的:(正则表达式,asp)