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(ファイル名))
content=f.ReadAll
f.閉じる
f=何も設定しない
set fso=nothing
set re=新しい正規表現
re.pattern="^s*="
aspEnd=1
aspStart=inStr(aspEnd,content,"<%")+2
do while aspStart>aspEnd+1
Response.write Mid(content,aspEnd,aspStart-aspEnd-2)
aspEnd=inStr(aspStart,content,"%>")+2
Execute(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write "))
aspStart=inStr(aspEnd,content,"<%")+2
ループ
Response.write Mid(content,aspEnd)
re=nothing を設定する
End 関数
使用例: include("youinc.asp")
ただし、インクルードファイルにインクルードファイルが存在する場合、この関数は動作しません。上記の機能を元に、インクルードファイル内に通常のインクルードファイル <!--#include file="filename.asp" --> もあり、これも正常に動作するように改良しました。
関数 includeconvert(oRegExp, strFilename, strBlock)
Dim incStart、incEnd、match、oMatches、str、code
'ASPコードと同様にインクルード部分のファイル名を抽出し、残りをそのまま出力
コード = ""
増加終了 = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'ターゲット文字列を検索するには、<!--#include はちょうど 13 文字なので、+13
Do While incStart>incEnd+12 '2 つの参照間の最小距離は連続しています--><--#、incStart は <!--#include から数えて 13 文字であるため、前の incEnd より少なくとも 13 文字大きくなければなりません1 >incEnd+12 の取得条件
str = Mid(strBlock,incEnd,incStart-incEnd-13)
str = Replace(str, """", """""") '単一の二重引用符を 2 つの二重引用符に置き換えます
str = 置換(str, VbCr, "")
str = 置換(str, VbLf, "")
str = 置換(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'file="filename.ext" または virtual="virtualname.ext" に一致し、タイプとファイル名の 2 つの部分文字列をキャプチャします。
oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3)) を設定します。
Set match = oMatches(0) 'キャプチャのセットが 1 つしかないと判断された場合、このセットの一致する部分文字列を取得するには、For Each match In oMatches... 次を使用せずにこれを行うことができます。
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/")) が参照されているときサブファイル名にパスが含まれている場合、そのパスを抽出し、サブファイル内で伝統的に参照されているファイル名の前に追加して、ファイルを開くための正しいパスを見つけます。これは、動的参照のファイル パスがメイン ファイルに対して相対的であるためです。 。 2 番目の部分文字列と一致するには、SubMatches(1) を使用します。
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
ループ
str = Mid(strBlock,incEnd)
str = Replace(str, """", """""") '単一の二重引用符を 2 つの二重引用符に置き換えます
str = 置換(str, VbCr, "")
str = 置換(str, VbLf, "")
str = 置換(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """"
includeconvert = コード
終了機能
関数 include(ファイル名)
ディムリ、コンテンツ、fso、f、aspStart、aspEnd、コード
Set fso=CreateObject("scripting.FileSystemObject")
Set f=fso.OpenTextFile(Server.MapPath(ファイル名))
content=f.ReadAll
f.閉じる
f=何も設定しない
fso=nothing
code = ""
を設定します。
aspEnd=1
aspStart=InStr(aspEnd,content,"<%")+2
re=new RegExp を設定します
aspStart>aspEnd+1 中に実行
' 従来の参照 <!--#inclde は ASP コード セグメントの外側にある必要があるため、最初に転送してください。
code = code & includeconvert (re, ファイル名, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspStart,content,"%>")+2
re.pattern="^s*=" 'この通常の置換では、元々 <% = str %> が標準の <%Response.Write str %> に置き換えられました。
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") '接続ブロック間の複数の Response.Write エラーを避けるために、ASP ブロックの前に復帰と改行を追加します同じ線上にある
aspStart=InStr(aspEnd,content,"<%")+2
ループ
code = code & includeconvert (re, ファイル名, Mid(content,aspEnd))
re=nothing を設定する
include = コード
End 関数
便宜上、上記の関数は最終的に、インクルードされたファイルを統合する ASP コード全体を返します。これを使用する場合は、Execute を使用して実行する必要があります。つまり、Execute(include("file. asp"))。
上記の関数は、インクルードされたファイルとメイン ファイルのパスが同じである場合にテストに合格します。インクルードされたファイルとメイン ファイルのパスが異なる場合、それ以上のフォールト トレランスは行われません。コメントや改善点を提供していただくことを歓迎します。