ASP en sí no admite la inclusión dinámica de archivos. La inclusión dinámica actual utiliza FSO para fusionar los archivos incluidos en el archivo principal y luego ejecutarlo. A continuación, el método de archivo de inclusión ordinario en forma de <!--#include file="filename.asp" --> también se denomina "referencia tradicional", y el archivo de inclusión dinámico implementado por funciones se denomina "referencia dinámica". ". Los programas comunes son los siguientes:
Función incluir (nombre de archivo)
Dim re,content,fso,f,aspStart,aspEnd
set fso=CreateObject("Scripting.FileSystemObject")
establecer f=fso.OpenTextFile(servidor.mappath(nombre de archivo))
contenido = f.ReadAll
f.cerrar
establecer f = nada
establecer fso = nada
establecer re = nueva expresión regular
re.pattern="^s*="
aspEnd=1
aspStart=inStr(aspEnd,contenido,"<%")+2
hacer mientras aspInicio>aspEnd+1
Response.write Mid(contenido,aspEnd,aspStart-aspEnd-2)
aspEnd=inStr(aspInicio,contenido,"%>")+2
Ejecutar(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Respuesta.Escribir "))
aspStart=inStr(aspEnd,contenido,"<%")+2
bucle
Respuesta.escribir Mid(content,aspEnd)
establecer re = nada
de la función final
: include("youinc.asp")
Sin embargo, esta función no funciona cuando hay archivos incluidos en los archivos incluidos. Basado en la función anterior, mejoré la siguiente función. En el archivo incluido, también hay un archivo de inclusión normal <!--#include file="filename.asp" --> que también puede ejecutarse normalmente.
Función includeconvert(oRegExp, strFilename, strBlock)
Dim incStart, incEnd, match, oMatches, str, código
'Extraiga el nombre del archivo de la parte incluida de la misma manera que el código ASP y genere el resto tal como está.
código = ""
final inc = 1
incStart = InStr(incEnd,strBlock,"<!--#include ") + 13 'Para encontrar una cadena de destino <!--#include tiene exactamente 13 caracteres, por lo que +13
Do While incStart>incEnd+12 'La distancia mínima entre dos referencias es continua--><--#, incStart tiene 13 caracteres contando desde <!--#include, por lo que debe ser al menos 13- más que el incEnd anterior 1 La condición obtenida de >incEnd+12
str = Medio(strBlock,incEnd,incStart-incEnd-13)
str = Reemplazar(cadena, """", """"") 'Reemplazar una comilla doble simple con dos comillas dobles
cadena = Reemplazar (cadena, VbCr, "")
cadena = Reemplazar (cadena, VbLf, "")
cadena = Reemplazar (cadena, VbCrLf, "")
código = código & VbCrLf & "Response.Write """ & str & """"
incEnd=InStr(incInicio,strBlock,"-->")+3
oRegExp.pattern="(w+)=""([^""]+)""" 'Match file="filename.ext" o virtual="virtualname.ext", captura las dos subcadenas de tipo y nombre de archivo
Establecer oMatches = oRegExp.Execute(Mid(strBlock,incStart,incEnd-incStart-3))
Set match = oMatches(0) 'Cuando se determina que solo hay un conjunto de capturas, para obtener las subcadenas coincidentes de este conjunto, puede hacerlo sin usar For Each match en oMatches... Siguiente
code = code & include(Mid(strFilename, 1, InStrRev(strFilename, "/")) & match.SubMatches(1)) 'Mid(filename, 1, InStrRev(filename, "/")) está siendo referenciado Cuando el El nombre del subarchivo tiene una ruta, extraiga la ruta y agréguela delante del nombre del archivo al que tradicionalmente se hace referencia en el subarchivo para encontrar la ruta correcta para abrir el archivo, porque la ruta del archivo en la referencia dinámica es relativa al archivo principal. . Para hacer coincidir la segunda subcadena, use SubMatches(1)
incStart = InStr(incEnd,strBlock,"<!--#include ")+13
Bucle
str = Medio(strBlock,incEnd)
str = Reemplazar(cadena, """", """"") 'Reemplazar una comilla doble simple con dos comillas dobles
cadena = Reemplazar (cadena, VbCr, "")
cadena = Reemplazar (cadena, VbLf, "")
cadena = Reemplazar (cadena, VbCrLf, "")
código = código & VbCrLf & "Response.Write """ & str & """"
incluirconvertir = código
Función final
Función incluir (nombre de archivo)
Dim re, contenido, fso, f, aspStart, aspEnd, código
Establecer fso=CreateObject("scripting.FileSystemObject")
Establecer f=fso.OpenTextFile(Server.MapPath(nombre de archivo))
contenido = f.ReadAll
f.cerrar
Establecer f=nada
Establecer fso=nada
código = ""
aspEnd=1
aspInicio=InStr(aspEnd,contenido,"<%")+2
Establecer re=nueva RegExp
Hacer mientras aspInicio>aspEnd+1
'La referencia tradicional <!--#inclde debe estar fuera del segmento de código ASP, así que transfiérala primero.
código = código & includeconvert (re, nombre de archivo, Mid(content,aspEnd,aspStart-aspEnd-2))
aspEnd=InStr(aspInicio,contenido,"%>")+2
re.pattern="^s*=" 'Este reemplazo regular reemplazó originalmente <% = str %> con el estándar <%Response.Write str %>
code = code & VbCrLf & re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ") 'Agrega retorno de carro y avance de línea antes del bloque ASP para evitar múltiples errores de Response.Write entre bloques de conexión en la misma linea
aspInicio=InStr(aspEnd,contenido,"<%")+2
Bucle
código = código & includeconvert (re, nombre de archivo, Mid(content,aspEnd))
Establecer re=nada
incluir = código
Función final
Por conveniencia, la función anterior finalmente devuelve el código ASP completo que integra el archivo incluido. Al usarlo, debe usar Ejecutar para ejecutarlo, es decir, al usarlo, necesita: Ejecutar(include("file. áspid")).
La función anterior pasa la prueba cuando la ruta del archivo incluido y el archivo principal son las mismas. No hace mayor tolerancia a fallas cuando las rutas del archivo incluido y el archivo principal son diferentes. El tiempo es limitado. Bienvenido a proporcionar comentarios y mejoras.