ASP selbst unterstützt keine dynamische Einbindung von Dateien. Die aktuelle dynamische Einbindung nutzt FSO, um die eingebundenen Dateien in die Hauptdatei zusammenzuführen und sie dann auszuführen. Im Folgenden wird die gewöhnliche Include-Dateimethode in der Form <!--#include file="filename.asp" --> auch als "traditionelle Referenz" bezeichnet, und die durch Funktionen implementierte dynamische Include-Datei wird als "dynamische Referenz" bezeichnet ". Gängige Programme sind wie folgt:
Funktion 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.schließen
setze f=nichts
set fso=nothing
set re=new RegExp
re.pattern="^s*="
aspEnd=1
aspStart=inStr(aspEnd,content,"<%")+2
tun, während 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
Schleife
Response.write Mid(content,aspEnd)
setze re=nichts
der Endfunktion
: include("youinc.asp")
Diese Funktion funktioniert jedoch nicht, wenn in den enthaltenen Dateien enthaltene Dateien enthalten sind. Basierend auf der obigen Funktion habe ich die folgende Funktion verbessert. In der eingebundenen Datei gibt es auch eine normale Include-Datei <!--#include file="filename.asp" -->, die auch normal ausgeführt werden kann.
Funktion includeconvert(oRegExp, strFilename, strBlock)
Dimmen Sie incStart, incEnd, match, oMatches, str, code
'Extrahieren Sie den Dateinamen des Include-Teils auf die gleiche Weise wie den ASP-Code und geben Sie den Rest unverändert aus
Code = ""
incEnd = 1
incStart = InStr(incEnd,strBlock,"<!--#include") + 13 'Um eine Zielzeichenfolge zu finden, besteht <!--#include aus genau 13 Zeichen, also +13
Do While incStart>incEnd+12 'Der Mindestabstand zwischen zwei Referenzen ist kontinuierlich--><--#, incStart beträgt 13 Zeichen, gezählt von <!--#include, also muss es mindestens 13- länger sein als das vorherige incEnd 1 Die erhaltene Bedingung von >incEnd+12
str = Mid(strBlock,incEnd,incStart-incEnd-13)
str = Replacement(str, """", """"") 'Ersetzen Sie ein einzelnes doppeltes Anführungszeichen durch zwei doppelte Anführungszeichen
str = Ersetzen(str, VbCr, "")
str = Ersetzen(str, VbLf, "")
str = Ersetzen(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'Match file="filename.ext" oder virtual="virtualname.ext", erfasst die beiden Teilzeichenfolgen von Typ und Dateiname
Setze oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3))
Set match = oMatches(0) 'Wenn festgestellt wird, dass es nur einen Satz von Captures gibt, können Sie die passenden Teilzeichenfolgen dieses Satzes erhalten, ohne For Each match In oMatches... Next zu verwenden
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/")) wird referenziert Wenn die Wenn der Name der Unterdatei einen Pfad hat, extrahieren Sie den Pfad und fügen Sie ihn vor dem Dateinamen ein, auf den traditionell in der Unterdatei verwiesen wird, um den richtigen Pfad zum Öffnen der Datei zu finden, da der Dateipfad in der dynamischen Referenz relativ zur Hauptdatei ist . Um den zweiten Teilstring abzugleichen, verwenden Sie SubMatches(1)
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
Schleife
str = Mid(strBlock,incEnd)
str = Replacement(str, """", """"") 'Ersetzen Sie ein einzelnes doppeltes Anführungszeichen durch zwei doppelte Anführungszeichen
str = Ersetzen(str, VbCr, "")
str = Ersetzen(str, VbLf, "")
str = Ersetzen(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """
includeconvert = Code
Funktion beenden
Funktion include(Dateiname)
Dim re, content, fso, f, aspStart, aspEnd, code
Setze fso=CreateObject("scripting.FileSystemObject")
Setze f=fso.OpenTextFile(Server.MapPath(filename))
content=f.ReadAll
f.schließen
Setze f=nichts
Setze fso=nothing
code = ""
aspEnd=1
aspStart=InStr(aspEnd,content,"<%")+2
Setzen Sie re=new RegExp
Do While aspStart>aspEnd+1
'Traditionelle Referenz <!--#inclde muss außerhalb des ASP-Codesegments liegen, also zuerst übertragen.
code = code & includeconvert (re, filename, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspStart,content,"%>")+2
re.pattern="^s*=" 'Diese reguläre Ersetzung ersetzte ursprünglich <% = str %> durch den Standard <%Response.Write str %>
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") 'Wagenrücklauf und Zeilenvorschub vor dem ASP-Block hinzufügen, um mehrere Response.Write-Fehler zwischen Verbindungsblöcken zu vermeiden auf der gleichen Linie
aspStart=InStr(aspEnd,content,"<%")+2
Schleife
code = code & includeconvert (re, filename, Mid(content,aspEnd))
Setze re=nichts
include = Code
Endfunktion
Der Einfachheit halber gibt die obige Funktion letztendlich den gesamten ASP-Code zurück, der die enthaltene Datei integriert. Wenn Sie sie verwenden, müssen Sie Execute verwenden, um sie auszuführen, d. h. wenn Sie sie verwenden, benötigen Sie: Execute(include("file. asp")).
Die obige Funktion besteht den Test, wenn der Pfad der eingebundenen Datei und der Hauptdatei identisch sind. Wenn die Pfade der eingebundenen Datei und der Hauptdatei unterschiedlich sind, ist die Zeit begrenzt Wir freuen uns über Kommentare und Verbesserungen.