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