ASP lui-même ne prend pas en charge l'inclusion dynamique de fichiers. L'inclusion dynamique actuelle utilise FSO pour fusionner les fichiers inclus dans le fichier principal, puis l'exécuter. Dans ce qui suit, la méthode d'inclusion de fichier ordinaire sous la forme de <!--#include file="filename.asp" --> est également appelée "référence traditionnelle", et le fichier d'inclusion dynamique implémenté par les fonctions est appelé "référence dynamique ". Les programmes courants sont les suivants :
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.fermer
définir f = rien
set fso=rien
set re=new RegExp
re.motif="^s*="
aspFin=1
aspStart=inStr(aspEnd,content,"<%")+2
faire pendant que aspStart>aspEnd+1
Response.write Mid (contenu, aspEnd, aspStart-aspEnd-2)
aspEnd=inStr(aspStart,content,"%>")+2
Exécuter(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write "))
aspStart=inStr(aspEnd,content,"<%")+2
boucle
Réponse.write Mid(content,aspEnd)
définir re = rien
de la fonction de fin
: include("youinc.asp")
Cependant, cette fonction ne fonctionne pas lorsqu'il y a des fichiers inclus dans les fichiers inclus. Sur la base de la fonction ci-dessus, j'ai amélioré la fonction suivante. Dans le fichier inclus, il existe également un fichier d'inclusion normal <!--#include file="filename.asp" --> qui peut également s'exécuter normalement.
Fonction includeconvert (oRegExp, strFilename, strBlock)
Dim incStart, incEnd, match, oMatches, str, code
'Extraire le nom de fichier de la partie à inclure de la même manière que le code ASP et afficher le reste tel quel
code = ""
incFin = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'Pour trouver une chaîne cible <!--#include contient exactement 13 caractères, donc +13
Do While incStart>incEnd+12 'La distance minimale entre deux références est continue--><--#, incStart est de 13 caractères à compter de <!--#include, il doit donc être au moins 13- de plus que l'incEnd précédent 1 La condition obtenue de >incEnd+12
str = Milieu (strBlock, incEnd, incStart-incEnd-13)
str = Replace(str, """", """""") 'Remplacer un simple guillemet double par deux guillemets doubles
str = Remplacer(str, VbCr, "")
str = Remplacer(str, VbLf, "")
str = Remplacer(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incStart,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'Match file="filename.ext" ou virtual="virtualname.ext", capture les deux sous-chaînes de type et de nom de fichier
Définir oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3))
Set match = oMatches(0) 'Lorsqu'il est déterminé qu'il n'y a qu'un seul ensemble de captures, pour obtenir les sous-chaînes correspondantes de cet ensemble, vous pouvez le faire sans utiliser For Each match In oMatches... Suivant
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/")) est référencé lorsque le le nom du sous-fichier a un chemin, extrayez le chemin et ajoutez-le devant le nom de fichier traditionnellement référencé dans le sous-fichier pour trouver le bon chemin pour ouvrir le fichier, car le chemin du fichier en référence dynamique est relatif au fichier principal . Pour faire correspondre la deuxième sous-chaîne, utilisez SubMatches(1)
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
Boucle
str = Milieu (strBlock, incEnd)
str = Replace(str, """", """""") 'Remplacer un simple guillemet double par deux guillemets doubles
str = Remplacer(str, VbCr, "")
str = Remplacer(str, VbLf, "")
str = Remplacer(str, VbCrLf, "")
code = code & VbCrLf & "Response.Write """ & str & """"
inclureconvertir = code
Fonction de fin
La fonction inclut (nom de fichier)
Dim re, contenu, fso, f, aspStart, aspEnd, code
Définir fso=CreateObject("scripting.FileSystemObject")
Définir f=fso.OpenTextFile(Server.MapPath(filename))
content=f.ReadAll
f.fermer
Définir f = rien
Définir fso=rien
de code = ""
aspFin=1
aspStart=InStr(aspEnd,content,"<%")+2
Définir re=new RegExp
Faire pendant que aspStart>aspEnd+1
'La référence traditionnelle <!--#inclde doit être en dehors du segment de code ASP, transférez-la donc en premier.
code = code & includeconvert (re, nom de fichier, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspStart,content,"%>")+2
re.pattern="^s*=" 'Ce remplacement régulier remplaçait à l'origine <% = str %> par le standard <%Response.Write str %>
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") 'Ajouter un retour chariot et un saut de ligne avant le bloc ASP pour éviter plusieurs erreurs Response.Write entre les blocs de connexion sur la même ligne
aspStart=InStr(aspEnd,content,"<%")+2
Boucle
code = code & includeconvert (re, nom de fichier, Mid(content,aspEnd))
Définir re = rien
inclure = code
Fonction de fin
Pour plus de commodité, la fonction ci-dessus renvoie finalement l'intégralité du code ASP qui intègre le fichier inclus. Lorsque vous l'utilisez, vous devez utiliser Execute pour l'exécuter, c'est-à-dire que lorsque vous l'utilisez, vous avez besoin de : Execute(include("file. aspic")).
La fonction ci-dessus réussit le test lorsque le chemin du fichier inclus et celui du fichier principal sont identiques. Elle ne permet pas de tolérance aux pannes supplémentaire lorsque les chemins du fichier inclus et du fichier principal sont différents. Le temps est limité. bienvenue pour fournir des commentaires et des améliorations.