asp

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

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


发布日期:2023年04月04日
 
对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))

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

上一篇:ASPX文件上传限制类型实例源码

下一篇:asp byref 让函数同时返回多值几种做法