asp

位置:IT落伍者 >> asp >> 浏览文章

对ASP 动态包含文件方法的改进


发布日期:2019年08月02日
 
对ASP 动态包含文件方法的改进

ASP 本身不支持动态包含文件现在的动态包含是通过 FSO 把被包含的文件合并到主文件里再运行以下也有把形如 <!#include file="filenameasp" > 的普通包含文件方式称作“传统引用”用函数实现的动态包含文件称作“动态引用”常见的程序如下

                        Function include(filename)
            Dim recontentfsofaspStartaspEnd
            
            set fso=CreateObject("ScriptingFileSystemObject")
            set f=fsoOpenTextFile(servermappath(filename))
            content=fReadAll
            fclose
            set f=nothing
            set fso=nothing
            
            set re=new RegExp
            repattern="^s*="
            aspEnd=
            aspStart=inStr(aspEndcontent"<%")+
            do while aspStart>aspEnd+
            Responsewrite Mid(contentaspEndaspStartaspEnd)
            aspEnd=inStr(aspStartcontent"%>")+
            Execute(rereplace(Mid(contentaspStartaspEndaspStart)"ResponseWrite "))
            aspStart=inStr(aspEndcontent"<%")+
            loop
            Responsewrite Mid(contentaspEnd)
            set re=nothing
            End Function            
使用范例include("youincasp")

以上范例引自

但这处函数在处理补包含的文件中还有包含文件时就不灵了我在以上函数的基础上改进出来如下函数在被包含文件中还有普通的包含文件 <!#include file="filenameasp" > 也可正常运行

                        Function includeconvert(oRegExp strFilename strBlock)
            Dim incStart incEnd match oMatches str code
            用提取ASP代码的相同方式提取出include 部分的文件名其余部分原样输出
            code = ""
            incEnd =
            incStart = InStr(incEndstrBlock"<!#include ") + 要找个目标字符串<!#include 正好是个字符所以要+
            Do While incStart>incEnd+ 两个引用间距最小就是连续的><#incStart是从<!#include起数个字符所以要比前一个incEnd要至少多 得到的>incEnd+的条件
            str = Mid(strBlockincEndincStartincEnd)
            str = Replace(str """" """""") 把单个双引号换成两个双引号
            str = Replace(str VbCr "")
            str = Replace(str VbLf "")
            str = Replace(str VbCrLf "")
            code = code & VbCrLf & "ResponseWrite """ & str & """"
            incEnd=InStr(incStartstrBlock">")+
            oRegExppattern="(w+)=""([^""]+)""" 匹配 file="filenameext" 或 virtual="virtualnameext"捕捉类型及文件名两个子串
            Set oMatches = oRegExpExecute(Mid(strBlockincStartincEndincStart))
            Set match = oMatches() 确定只有一组捕捉时要得到这一组匹配的子串可以这样做省去用 For Each match In oMatches …… Next
            code = code & include(Mid(strFilename InStrRev(strFilename "/")) & matchSubMatches()) Mid(filename InStrRev(filename "/")) 是在被引用的子文件名有路径时把路径提取出来加在子文件中传统引用的文件名前面以找到正确的打开文件路径因为动态引用时的文件路径是相对主文件而言的要第二个匹配子串用SubMatches()
            incStart = InStr(incEndstrBlock"<!#include ")+
            Loop
            str = Mid(strBlockincEnd)
            str = Replace(str """" """""") 把单个双引号换成两个双引号
            str = Replace(str VbCr "")
            str = Replace(str VbLf "")
            str = Replace(str VbCrLf "")
            code = code & VbCrLf & "ResponseWrite """ & str & """"
            includeconvert = code
            End Function
            Function include(filename)
            Dim re content fso f aspStart aspEnd code
            Set fso=CreateObject("scriptingFileSystemObject")
            Set f=fsoOpenTextFile(ServerMapPath(filename))
            content=fReadAll
            fclose
            Set f=nothing
            Set fso=nothing
            
            code = ""
            aspEnd=
            aspStart=InStr(aspEndcontent"<%")+
            Set re=new RegExp
            Do While aspStart>aspEnd+
            传统引用<!#inclde 肯定是在ASP代码段以外的所以先转
            code = code & includeconvert (re filename Mid(contentaspEndaspStartaspEnd))
            aspEnd=InStr(aspStartcontent"%>")+
            repattern="^s*=" 这段正则替换原来是把 <% = str % > 换回成标准的 <%ResponseWrite str % >
            code = code & VbCrLf & rereplace(Mid(contentaspStartaspEndaspStart)"ResponseWrite ") ASP块前面再加回车换行以避免连接块之间多个 ResponseWrite在同一行的错误
            aspStart=InStr(aspEndcontent"<%")+
            Loop
            code = code & includeconvert (re filename Mid(contentaspEnd))
            Set re=nothing
            include = code
            End Function            
方便起见以上函数最终返回的是整合了包含文件的整个 ASP 代码使用时还要再用 Execute 执行之即使用时需要Execute(include("fileasp"))

以上函数对被包含文件与主文件同一路径时测试通过未对被包含文件与主文件路径不同的情况做进一步容错时间有限欢迎有兴趣的朋友提出意见和改进

               

上一篇:ASP常用函数:getIMG()

下一篇:使用NetBox编译asp 完全摆脱iis束缚