ASP 本身不支持動態包含文件
現在的動態包含是通過 FSO 把被包含的文件合並到主文件裡再運行
以下也有把形如 <!
#include file=
filename
asp
> 的普通包含文件方式稱作
傳統引用
用函數實現的動態包含文件稱作
動態引用
常見的程序如下
Function include(filename)
Dim re
content
fso
f
aspStart
aspEnd
set fso=CreateObject(
Scripting
FileSystemObject
)
set f=fso
OpenTextFile(server
mappath(filename))
content=f
ReadAll
f
close
set f=nothing
set fso=nothing
set re=new RegExp
re
pattern=
^\s*=
aspEnd=
aspStart=inStr(aspEnd
content
<%
)+
do while aspStart>aspEnd+
Response
write Mid(content
aspEnd
aspStart
aspEnd
)
aspEnd=inStr(aspStart
content
%\>
)+
Execute(re
replace(Mid(content
aspStart
aspEnd
aspStart
)
Response
Write
))
aspStart=inStr(aspEnd
content
<%
)+
loop
Response
write Mid(content
aspEnd)
set re=nothing
End Function
使用范例
include(
youinc
asp
)
以上范例引自
但這處函數在處理補包含的文件中還有包含文件時就不靈了
我在以上函數的基礎上改進出來如下函數
在被包含文件中還有普通的包含文件 <!
#include file=
filename
asp
> 也可正常運行
Function includeconvert(oRegExp
strFilename
strBlock)
Dim incStart
incEnd
match
oMatches
str
code
用提取ASP代碼的相同方式提取出include 部分的文件名
其余部分原樣輸出
code =
incEnd =
incStart = InStr(incEnd
strBlock
<!
#include
) +
要找個目標字符串<!
#include 正好是
個字符
所以要+
Do While incStart>incEnd+
兩個引用間距最小就是連續的
><
#
incStart是從<!
#include起數
個字符
所以要比前一個incEnd要至少多
得到的>incEnd+
的條件
str = Mid(strBlock
incEnd
incStart
incEnd
)
str = Replace(str
)
把單個雙引號換成兩個雙引號
str = Replace(str
VbCr
)
str = Replace(str
VbLf
)
str = Replace(str
VbCrLf
)
code = code & VbCrLf &
Response
Write
& str &
incEnd=InStr(incStart
strBlock
>
)+
oRegExp
pattern=
(\w+)=
([^
]+)
匹配 file=
filename
ext
或 virtual=
virtualname
ext
捕捉類型及文件名兩個子串
Set oMatches = oRegExp
Execute(Mid(strBlock
incStart
incEnd
incStart
))
Set match = oMatches(
)
確定只有一組捕捉時
要得到這一組匹配的子串
可以這樣做
省去用 For Each match In oMatches …… Next
code = code & include(Mid(strFilename
InStrRev(strFilename
/
)) & match
SubMatches(
))
Mid(filename
InStrRev(filename
/
)) 是在被引用的子文件名有路徑時
把路徑提取出來
加在子文件中傳統引用的文件名前面
以找到正確的打開文件路徑
因為動態引用時的文件路徑是相對主文件而言的
要第二個匹配子串用SubMatches(
)
incStart = InStr(incEnd
strBlock
<!
#include
)+
Loop
str = Mid(strBlock
incEnd)
str = Replace(str
)
把單個雙引號換成兩個雙引號
str = Replace(str
VbCr
)
str = Replace(str
VbLf
)
str = Replace(str
VbCrLf
)
code = code & VbCrLf &
Response
Write
& str &
includeconvert = code
End Function
Function include(filename)
Dim re
content
fso
f
aspStart
aspEnd
code
Set fso=CreateObject(
scripting
FileSystemObject
)
Set f=fso
OpenTextFile(Server
MapPath(filename))
content=f
ReadAll
f
close
Set f=nothing
Set fso=nothing
code =
aspEnd=
aspStart=InStr(aspEnd
content
<%
)+
Set re=new RegExp
Do While aspStart>aspEnd+
傳統引用<!
#inclde 肯定是在ASP代碼段以外的
所以先轉
code = code & includeconvert (re
filename
Mid(content
aspEnd
aspStart
aspEnd
))
aspEnd=InStr(aspStart
content
%\>
)+
re
pattern=
^\s*=
這段正則替換原來是把 <% = str % > 換回成標准的 <%Response
Write str % >
code = code & VbCrLf & re
replace(Mid(content
aspStart
aspEnd
aspStart
)
Response
Write
)
ASP塊前面再加回車換行
以避免連接塊之間多個 Response
Write在同一行的錯誤
aspStart=InStr(aspEnd
content
<%
)+
Loop
code = code & includeconvert (re
filename
Mid(content
aspEnd))
Set re=nothing
include = code
End Function
方便起見
以上函數最終返回的是整合了包含文件的整個 ASP 代碼
使用時還要再用 Execute 執行之
即使用時需要
Execute(include(
file
asp
))
以上函數對被包含文件與主文件同一路徑時測試通過
未對被包含文件與主文件路徑不同的情況做進一步容錯
時間有限
歡迎有興趣的朋友提出意見和改進
From:http://tw.wingwit.com/Article/program/net/201311/12082.html